通过Mongoose的值仅查找数组中的一个项目

这里是我的模式与一些数据的一个例子:

client { menus: [{ sections: [{ items: [{ slug: 'some-thing' }] }] }] } 

我正在尝试像这样select它:

 Schema.findOne({ client._id: id, 'menus.sections.items.slug': 'some-thing' }).select('menus.sections.items.$').exec(function(error, docs){ console.log(docs.menus[0].sections[0].items[0].slug); }); 

当然,“docs.menus [0] .sections [0] .items [0] .slug”只适用于每个数组中只有一个东西。 如果每个数组中有多个项目,而不必遍历所有内容以find它,我怎么能做到这一点?

如果你需要更多的细节让我知道。

聚合框架非常适合在深层嵌套数组中find位置操作符会使您失败的东西:

 Model.aggregate( [ // Match the "documents" that meet your criteria { "$match": { "menus.sections.items.slug": "some-thing" }}, // Unwind the arrays to de-normalize as documents { "$unwind": "$menus" }, { "$unwind": "$menus.sections" }, { "$unwind": "$menus.sections.items" } // Match only the element(s) that meet the criteria { "$match": { "menus.sections.items.slug": "some-thing" }} // Optionally group everything back to the nested array // One step at a time { "$group": { "_id": "$_id", "items": { "$push": "$menus.sections.items.slug" } }}, { "$group": { "_id": "$_id", "sections": { "$push": { "items": "$items" } } }}, { "$group": { "_id": "$_id", "menus": { "$push": { "sections": "$sections" } } }}, ], function(err,results) { } ) 

当使用$group时,请参阅其他汇总运算符(如$first来保留文档中的其他字段。