mongoose查询字典数组

你如何处理包含字典的数组? 我想把所有的post都放在一起,所以我可以search他们的文本。

我的企图继续使用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数据和使用mongo shell将数据放入mongodb的命令:

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

* 或者,在这里作为一行插入名为my_collection的集合中的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}]} ) 

writing数组中的对象被视为子/embedded文档 。 这意味着它们在存储在数据库中时被分配了一个_id

所以,有几种方法可以基于这些子文档来查询Blog

 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) }); 

正如你看到的,如果你有完整的对象(包括_id ),你只能find包含元素的数组的对象。

你可以在这个GIST上查看整个源代码 – 自己testing一下:)

希望这可以帮助 :)

在这里阅读mongoose的文档