Mongodb 计数具有相同数组字段的文档

Mongodb 计数具有相同数组字段的文档,mongodb,many-to-many,Mongodb,Many To Many,我是蒙哥的新手,我真的不知道该如何应对: 假设我们在owners集合中有此模式: { _id: ObjectId, name: "name", cars: [ObjectId, ObjectId, ObjectId, ...] } 其中cars数组中的_id与其他集合相关,例如cars 现在,每个车主都可以拥有多辆车,而且每辆车都可以拥有多个车主(只是多对多关系) 例如 问题是如何检查A先生与哪些车主共用汽车。 A先生如何得到这样的结果: [ {'owner_id':

我是蒙哥的新手,我真的不知道该如何应对:

假设我们在
owners
集合中有此模式:

{
    _id: ObjectId,
    name: "name",
    cars: [ObjectId, ObjectId, ObjectId, ...]
}
其中
cars
数组中的_id与其他集合相关,例如
cars

现在,每个车主都可以拥有多辆车,而且每辆车都可以拥有多个车主(只是多对多关系)

例如

问题是如何检查A先生与哪些车主共用汽车。
A先生如何得到这样的结果:

[
{'owner_id': '3', 'cars': 2},
{'owner_id': '4', 'cars': 3}
]
我尝试使用聚合框架,但我看不到实现它的方法


编辑
我写了这个函数,但我不知道它是否正确

功能(所有者)
{
ret={}
owner.cars.forEach(功能(汽车){
find({cars:car}).forEach(函数(own2){
if(own2.\u id==所有者.\u id){
返回;
}
if(ret[own2.\u id.str]!==未定义){
ret[own2._id.str]+=1;
}
否则{
ret[own2._id.str]=1;
}
});
});
回程网
}

如果您只关心与A先生共享的所有者,您可以尝试以下方法:

首先,获得A先生拥有的汽车:

var cars = db.owners.findOne({'name':'Mr. A'})
然后对拥有与A先生类似的车辆(不包括A先生)的车主进行汇总

db.owners.aggregate(
  {'$match':{$and : [{'cars':{'$in':cars}},{'name':{'$ne':'Mr. A'}}]}},
  {'$unwind':'$cars'},
  {'$group':{'_id':'$_id','owner_id':'$_id','cars':{$sum:1}}}
)

我还没有测试过上述查询,但我鼓励您尝试一下。

我会用两个查询来测试。它将要求您在调用代码中存储一个临时变量(我称之为“cars”)。它应该是这样的:

var cars = db.owners.findOne({'name':'Mr. A'}, {cars:1})

var shared = db.owners.find({'name':{ '$ne': 'Mr. A'}, 'cars': {'$in':cars}}, {'name':1})

不能在一个查询/一个聚合中执行此操作。您可以使用一个map/reduce作业来完成,但两个查询会更快。
var cars = db.owners.findOne({'name':'Mr. A'}, {cars:1})

var shared = db.owners.find({'name':{ '$ne': 'Mr. A'}, 'cars': {'$in':cars}}, {'name':1})