Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用Mongoose按值仅查找数组数组中的项_Node.js_Mongodb_Mongoose_Mongodb Query_Aggregation Framework - Fatal编程技术网

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]。。。当你比单个数组(数组中的数组)更深的时候,有没有办法做到这一点?基本上,我只希望它返回相关的菜单、节、项。。。并非所有菜单、部分等。