Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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
Mongodb 如何在mongo中使用嵌套数组的投影_Mongodb_Mongoose_Mongodb Query_Aggregation Framework - Fatal编程技术网

Mongodb 如何在mongo中使用嵌套数组的投影

Mongodb 如何在mongo中使用嵌套数组的投影,mongodb,mongoose,mongodb-query,aggregation-framework,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我的模式如下所示: new Schema ( users:[userSchema] } userSchema = new Schema ({ email: String, companies: [companySchema] }) companySchema = new Schema ({ dept:{ id: String, desc: String }, rooms: { name: String, location: String }); 我希望能够找到一个特定的部门,我知道它的id

我的模式如下所示:

new Schema (
users:[userSchema]
}

userSchema = new Schema ({
email: String,
companies: [companySchema]
})

companySchema = new Schema ({
dept:{
id: String,
desc: String
},
rooms: {
name: String,
location: String
});
我希望能够找到一个特定的部门,我知道它的id,并返回只是该部门。我无法找出我可以如何使用这个预测。我尝试了以下方法和几种变体:

Model.findOne({“users.companies.dept.id”: “10},{users:{$elemMatch:{dept:{$elemMatch:{id:”10”}}}}});
所有这些都会选择整个用户,而不仅仅是部门

我的解决方法是使用findOne()查找用户,并使用一些节点代码获取dept。非常感谢您的任何见解

我有这个收藏

> db.depts.find()
{ "_id" : ObjectId("55af5cefa894779dc40208e7"), "dept" : { "id" : 2, "desc" : "test" }, "rooms" : { "name" : "room", "location" : "test2" } }
下面的查询只返回
dept

> db.depts.find({'dept.id':2},{'dept':1})
{ "_id" : ObjectId("55af5cefa894779dc40208e7"), "dept" : { "id" : 2, "desc" : "test" } }
所以在蒙哥斯,应该是这样


Model.findOne({“users.companys.dept.id”:10},{“users.companys.dept”:1,“\u id”:0})
在匹配数组时,MongoDB中的投影只能在“top”数组级别工作。要在“服务器上”执行更多操作,您需要使用“聚合框架”,它比标准的
更擅长执行此操作。find()
查询能够执行以下操作:

Model.aggregate(
[
//匹配包含此匹配项的文档
{“$match”:{“users.companys.dept.id”:“10”},
{“$project”:{
“用户”:{
“$setDiffernce”:[
{“$map”:{
“输入”:“$users”,
“作为”:“用户”,
“在”:{
“$setDifference”:[
{“$map”:{
“输入”:“$$user.companys”,
“as”:“comp”,
“在”:{
“$cond”:[
{“$eq”:[“$$comp.dept.id”,“10”]},
“$comp”,
假的
]
}
}},
[错误]
]
}
}},
[[]]
]
}    
}}
],
功能(错误、结果){
}
);
这将“剥离”任何不匹配的元素以及由于其中没有匹配元素而产生的任何“空”数组。只要包含的元素在其组合属性中都是“唯一”的,使用它通常是安全的

由于只包含
$match
$project
阶段,它的速度也相当快,几乎与标准的
.find()
操作一样快。这基本上就是
.find()
所做的。因此,除了“稍微”过度暴露外,没有区别。当然,每次比赛从服务器返回的流量更少

如果您的MongoDB服务器版本低于2.6且没有这些运算符,或者您的“dept.id”值在内部数组中不唯一,您也可以这样做

Model.aggregate(
[
//匹配包含此匹配项的文档
{“$match”:{“users.companys.dept.id”:“10”},
//展开阵列
{“$unwind”:“$users”},
{“$unwind”:“$users.COMPANYS”},
//匹配到“筛选”数组
{“$match”:{“users.companys.dept.id”:“10”},
//返回公司
{“$组”:{
“_id”:{
“\u id”:“$\u id”,
“用户id”:“$user.\U id”,
“userEmail”:“$user.email”
},
“公司”:{“$push”:“$users.companys”}
}},
//现在将“用户”作为数组推送
{“$组”:{
“\u id”:“$\u id.\u id”,
“用户”:{“$push”:{
“\u id”:“$\u id.userId”,
“电子邮件”:“$\u id.userEmail”,
“公司”:“$公司”
}}
}}
],
功能(错误、结果){
}
);
但是,
$unwind
的所有使用对性能来说都是可怕的,您最好像现在这样简单地删除应用程序代码中不需要的项目


因此,如果您的服务器支持,则使用第一个选项减轻应用程序和网络传输的负担。否则,请坚持您正在做的事情,因为它可能会更快。

我不认为这是类似的-您必须为ArrayShank使用$itemMatch-这非常有教育意义!我将开始阅读聚合框架