2013-05-13 3 views
1

Как вы работаете с массивами, которые содержат словари? Я пытаюсь собрать все поля post, чтобы я мог искать их текст.mongoose query для массива словарей

Мои попытки продолжаются в никуда с использованием mongo оболочки.

User.Blog().find({}).where('post').in(writing).exec(function (err, result) { 
    //do something with results 
}); // doesn't work 

схема (редактирование: фиксированное от комментариев @JAM)

var blogSchema = new mongoose.Schema({ 
    group: String, 
    writing: [{ 
     post: String, 
     name : Number 
     }] 
}); 

var Blog = mongoose.model('Blog', blogSchema); 

Обновление: добавление данных JSON и команды, чтобы поместить данные в MongoDB используя Монго оболочку:

{ 
    group: "Design Writing", 
    writing: [{ 
     post: "A very very very short post.", 
     name: 10 
    }, { 
     post: "An early morning post about everything.", 
     name: 11 
    }] 
} 

* Или здесь, как одна строка для вставки в db в коллекции с именем my_collection: *

db.my_collection.insert({group: "Design Writing", writing: [{post: "A very very very short post.",name: 10}, {post: "An early morning post about everything.",name: 11}]}) 

ответ

5

объекты в массиве writing трактуется как sub/embedded-documents. Это означает, что они назначаются _id, когда они хранятся в базе данных.

Итак, есть несколько способов, вы можете запросить Blog S на основе этих вспомогательных документов:

var ObjectId = mongoose.Types.ObjectId; 

// Assuming these objects are in the 'writing' array of a Blog 
var postObject = { post: 'some text', name: 10 }, 
    postObjectWithId = { _id: new ObjectId(), post: 'some text', name: 10 }; 

// Example #1 Works! 
Blog.find({'writing.post': postObject.post}) 
    .exec(function(err, res){ onBlogResult("Ex#1", err, res) }); 

// Example #2 Works! 
Blog.find({})       
    .where('writing').in([postObjectWithId]) 
    .exec(function(err, res){ onBlogResult("Ex#2", err, res) }); 

// Example #3 Works - its the same as example #2! 
Blog.find({'writing': { $in: [ postObjectWithId ]}}) 
    .exec(function(err, res){ onBlogResult("Ex#3", err, res) }); 

// Example #4 Fails because of missing _id on postObject! 
Blog.find({'writing': { $in: [ postObject ]}}) 
    .exec(function(err, res){ onBlogResult("Ex#4", err, res) }); 

Как вы видите, вы можете только find объекты с массивом, содержащим элемент, используя in, если у вас есть полный объект (включая _id).

Вы можете просмотреть весь источник на этой GIST - Проверьте это для себя :)

Надеется, что это помогает :)

Read the mongoose docs here.

+0

Что происходит в «postObj»? Я попробовал «пост», но это не работает - ближе, но что-то не работает. Меня пугает цепочка. (Yeh, я набрал схему неправильно при составлении примера.) –

+0

postObj example '{post:" heyho ", name: 1}' - как указывает ваша схема. Я думаю, что это работает. – JAM

+0

Хммм. Все еще не работает. Находка() работает, но я не могу глубже проникнуть в структуру с помощью мангуста. Я буду пытаться, хотя я пробовал дюжину версий. Я могу вытащить то, что мне нужно, явно выписав в exec функции this: var just_the_post = result [0] ['writing'] [0] ['post'] '; D –

Смежные вопросы