我在Mongodb中有几个用户集合。如下:
userCollection1:
User1: {name:xxx,
id:xxx
<other fields>}
User2: {name:xxx,
id:xxx
<other fields>}
..other users..
userCollection2:
User1: {name:xxx,
id:xxx
<other fields>}
User3: {name:xxx,
id:xxx
<other fields>}
..other users..
userCollection3:{} //All same scheme as previous collection
userCollection4:{}
userCollection5:{}
每个都是不同用户列表的单独集合。 现在,我试图获取所有这5个集合中的用户。
我能想到的一种方法是for循环。
对于collection1中的每个用户,
在集合2、3、4、5中查询他的ID或姓名。
如果该ID在所有收藏夹中,请记录其ID。
否则,请跳过。
然后转到下一个用户。
我觉得这种方法不是很有效。使用mongodb聚合方法可能会有更好的方法。
对此情况有何建议?或者我应该只使用for循环?
答案 0 :(得分:1)
您可以加入所有5个用户集合以获取公共用户ID。为此,您必须使用聚合管道中的$ lookup函数。
userCollection1.aggregate([{
$lookup:{
from:"userCollection2",
localField:"id",
foreignField:"id",
as:"alias_name"
}
}
]
)
这将返回两个集合中的所有匹配文档。
答案 1 :(得分:1)
在所有5个集合中搜索普通用户时,我们将查询用户1集合并使用$ lookup并加入所有其他4个集合。这是绝对可行的查询建议。
所有用户集合具有与上述相同的架构:名称和工作字段。
db.getCollection('user1').aggregate({ "$facet": { "presentInAllCollections": [{ "$lookup": { "from": "user2", "localField": "name", "foreignField": "name", "as": "User2" } }, { "$lookup": { "from": "user3", "localField": "name", "foreignField": "name", "as": "User3" } }, { "$lookup": { "from": "user4", "localField": "name", "foreignField": "name", "as": "User4" } }, { "$lookup": { "from": "user5", "localField": "name", "foreignField": "name", "as": "User5" } }] } }, { $project: { "foundUser": { $filter: { input: '$presentInAllCollections', as: 'arrayElement', cond: { "$and": [{ $ne: ['$$arrayElement.User2', []] }, { $ne: ['$$arrayElement.User3', []] }, { $ne: ['$$arrayElement.User4', []] }, { $ne: ['$$arrayElement.User5', []] } ] } } } } })