Node.js 使用Mongoose按值仅查找数组数组中的项
下面是我的模式示例,其中包含一些数据:Node.js 使用Mongoose按值仅查找数组数组中的项,node.js,mongodb,mongoose,mongodb-query,aggregation-framework,Node.js,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,下面是我的模式示例,其中包含一些数据: client { menus: [{ sections: [{ items: [{ slug: 'some-thing' }] }] }] } 我试着这样选择它: Schema.findOne({ client._id: id, 'menus.sections.items.slug': 'some-thing' }).select('menus.sections.items.$').exec
client {
menus: [{
sections: [{
items: [{
slug: 'some-thing'
}]
}]
}]
}
我试着这样选择它:
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”仅在每个数组中只有一个对象时有效。如果每个数组中有多个项,而不必遍历所有内容来查找它,我如何使这项工作正常
如果您需要更多详细信息,请告诉我。对于在位置运算符将使您失败的深度嵌套数组中查找内容非常有用:
Model.aggregate(
[
//匹配符合您标准的“文档”
{“$match”:{
“菜单.部分.项目.段塞”:“一些东西”
}},
//展开数组以作为文档反规范化
{“$unwind”:“$menus”},
{“$unwind”:“$menus.sections”},
{“$unwind”:“$menus.sections.items”}
//仅匹配符合条件的元素
{“$match”:{
“菜单.部分.项目.段塞”:“一些东西”
}}
//(可选)将所有内容分组回嵌套数组
//一步一个脚印
{“$组”:{
“\u id”:“$\u id”,
“items”:{“$push”:“$menus.sections.items.slug”}
}},
{“$组”:{
“\u id”:“$\u id”,
“各节”:{
“$push”:{“items”:“$items”}
}
}},
{“$组”:{
“\u id”:“$\u id”,
“菜单”:{
“$push”:{“节”:“$sections”}
}
}},
],
功能(错误、结果){
}
)
另请参阅其他聚合运算符,例如在使用时保留文档中的其他字段。您的问题实际上是多个
菜单.sections.items.slug
可以匹配“some thing”,并且您希望返回所有字段,而不是仅返回一个。或者你是说别的什么?不,slug是唯一的,应该只返回一个东西,但它返回父数组中的所有内容。。。因此,使用[0]不起作用。您引用的“如果每个数组中有多个项目,我如何使此工作”我要求您解释,如果您的问题暗示不匹配多个项目,您的意思是什么。我的问题写得很差。。类似Schema.findOne({client.\u id:id,'menumes.\u id':id})的东西。选择('menumes.$)。。。将返回一个包含一项的数组,即docs.menus[0]。。。当你比单个数组(数组中的数组)更深的时候,有没有办法做到这一点?基本上,我只希望它返回相关的菜单、节、项。。。并非所有菜单、部分等。