获取Mongodb中几个集合的通用ID?

时间:2019-07-06 04:47:46

标签: mongodb mongoose nosql

我在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循环?

2 个答案:

答案 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', []] } ] } } } } })