我有两个Collection :

  1. 用户名:‘XXXX’,角色ID:1,全名:‘xxxxxxx’}
  2. CustomerMaster AS{用户名:‘XXXX’,地址:‘yyyy’,名字:‘zzzzz’,姓氏:‘ppp’}

现在,我希望在userMaster上执行MongoDB$unionWith,以组合两个结果并从给定的用户列表中查找用户,因此我的聚合管道如下所示:

[
    {'$match': {'userName': {'$in': userList}}
    }, {
      '$unionWith': {
        'coll': 'customerMaster', 
        'pipeline': [
          {'$match': {'userName': {'$in': userList}}
          }
        ]
      }
    }
]

现在,两个集合中可能存在相同的userName.所以为了避免重复,我想在这个管道中添加$group.然而,我想更喜欢customerMaster,如果它存在的话,否则userMaster.因为我想知道地址. 如何写这样的$组阶段?

推荐答案

一种 Select 是使用只有一个集合具有的字段,并按其排序:

db.userMaster.aggregate([
  {$match: {userName: {$in: userList}}},
  {$unionWith: {
      coll: "customerMaster",
      pipeline: [{$match: {userName: {$in: userList}}}]
  }},
  {$sort: {roleId: -1}},
  {$group: {_id: "$userName", doc: {$first: "$$ROOT"}}}
])

看看它在mongoDB playground号公路上是如何工作的

在这种情况下,另一种 Select 是使用$lookup而不是$unionWith:

db.userMaster.aggregate([
  {$facet: {
      userMaster: [{$match: {userName: {$in: userList}}}],
      customerMaster: [
        {$lookup: {
            from: "customerMaster",
            let: {},
            pipeline: [{$match: {userName: {$in: userList}}}],
            as: "res"
          }}
      ]
  }},
  {$project: {
      userMaster: {$first: "$userMaster"},
      customerMaster: {$first: "$customerMaster"}
  }},
  {$replaceRoot: {
      newRoot: {$ifNull: ["$userMaster", {$first: "$customerMaster.res"}]}
  }}
])

Mongodb相关问答推荐

会话的Mongo-go驱动程序版本.Copy()

我们可以在Mongoose中这样使用Unique:[True,";This to Unique&qot;]吗

在提供的文档(_Id)之后和之前,是否有一个Mongo操作来获取已排序(和/或过滤)集合中的文档计数?

除非满足某个条件,否则Mongo是否按日期排序?

数组中字符串的Mongo查询集合和推送到新数组嵌套对象

在服务器上部署后端时判断??=默认判断

db.createCollection 不是函数

Meteor 如何接收对 MongoDB 查询结果的更新?

mongodump 是否锁定数据库?

MongoDB 中 cursor.count() 和 cursor.size() 之间的区别

如何解决 ClassNotFoundException:com.mongodb.connection.BufferProvider?

将 MongoDB 数据库复制到本地计算机

用于嵌入式集合的 MongoDB 首选模式.文档与数组

MongoDB限制内存

在安装的 MongoDB homebrew 中设置 dbpath (Mac OS)

mongodb: UnknownError assertion src/mongo/db/server_options_helpers.cpp:355

Mongoose 版本控制:when is it safe to disable it?

MongoDB MapReduce - 发出一个键/一个值不调用reduce

使用 $in 进行不区分大小写的搜索

有没有办法执行更新操作的dry run?