使用$ lookup运算符的多个联接条件

用户名

具有以下两个集合:

// collection1:
{
  user1: 1,
  user2: 2,
  percent: 0.56
}

// collection2:
{
  user1: 1,
  user2: 2,
  percent: 0.3
}

我想在user1上加入这两个收藏user2

我如何编写管道以获得以下结果:

{
  user1: 1,
  user2: 2,
  percent1: 0.56,
  percent2: 0.3
}
聚苯乙烯

我们可以使用$lookup3.6版及更高版本中聚合管道运算符来执行多个加入条件

我们需要使用let可选字段将字段的值分配给变量然后,您可以在pipeline字段阶段访问这些变量,在其中指定要在集合上运行的管道。

请注意,在此$match阶段中,我们使用$expr评估查询运算符来比较字段的值。

流水线的最后一个阶段是$replaceRoot聚合流水线阶段,在此阶段,我们仅使用运算符$lookup结果与$$ROOT文档的一部分合并$mergeObjects

db.collection2.aggregate([
       {
          $lookup: {
             from: "collection1",
             let: {
                firstUser: "$user1",
                secondUser: "$user2"
             },
             pipeline: [
                {
                   $match: {
                      $expr: {
                         $and: [
                            {
                               $eq: [
                                  "$user1",
                                  "$$firstUser"
                               ]
                            },
                            {
                               $eq: [
                                  "$user2",
                                  "$$secondUser"
                               ]
                            }
                         ]
                      }
                   }
                }
             ],
             as: "result"
          }
       },
       {
          $replaceRoot: {
             newRoot: {
                $mergeObjects:[
                   {
                      $arrayElemAt: [
                         "$result",
                         0
                      ]
                   },
                   {
                      percent1: "$$ROOT.percent1"
                   }
                ]
             }
          }
       }
    ]
)

该管道产生如下所示的内容:

{
    "_id" : ObjectId("59e1ad7d36f42d8960c06022"),
    "user1" : 1,
    "user2" : 2,
    "percent" : 0.3,
    "percent1" : 0.56
}

如果您使用的不是3.6+版本,则可以先使用您的一个字段(例如说“ user1”)加入,然后使用$unwind聚合管道运算符从此处展开匹配文档的数组管道的下一个阶段是$redact使用$$KEEP$$PRUNE变量过滤掉那些来自“ joined”集合和输入文档中“ user2”值不相等的文档的阶段然后,您可以$project分阶段调整文档的形状。

db.collection1.aggregate([
    { "$lookup": { 
        "from": "collection2", 
        "localField": "user1", 
        "foreignField": "user1", 
        "as": "collection2_doc"
    }}, 
    { "$unwind": "$collection2_doc" },
    { "$redact": { 
        "$cond": [
            { "$eq": [ "$user2", "$collection2_doc.user2" ] }, 
            "$$KEEP", 
            "$$PRUNE"
        ]
    }}, 
    { "$project": { 
        "user1": 1, 
        "user2": 1, 
        "percent1": "$percent", 
        "percent2": "$collection2_doc.percent"
    }}
])

产生:

{
    "_id" : ObjectId("572daa87cc52a841bb292beb"),
    "user1" : 1,
    "user2" : 2,
    "percent1" : 0.56,
    "percent2" : 0.3
}

如果集合中的文档具有相同的结构,并且发现自己经常执行此操作,则应考虑将两个集合合并为一个或将这些集合中的文档插入到新集合中。

db.collection3.insertMany(
    db.collection1.find({}, {"_id": 0})
    .toArray()
    .concat(db.collection2.find({}, {"_id": 0}).toArray())
)

然后,$group您的文档按“ user1”和“ user2”

db.collection3.aggregate([
    { "$group": {
        "_id": { "user1": "$user1", "user2": "$user2" }, 
        "percent": { "$push": "$percent" }
    }}
])

产生:

{ "_id" : { "user1" : 1, "user2" : 2 }, "percent" : [ 0.56, 0.3 ] }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

多个关联使用NOT运算符联接查询

来自分类Dev

多个关联使用NOT运算符联接查询

来自分类Dev

使用&&运算符快速处理多个条件

来自分类Dev

使用OR运算符的AngularJS ng类多个条件

来自分类Dev

使用条件运算符

来自分类Dev

如何使用IN运算符联接表?

来自分类Dev

解析TSQL / Sybase * =用于使用ANTLR4表示外部联接的条件运算符

来自分类Dev

使用条件运算符?获得偶数

来自分类Dev

对If..Else使用条件运算符

来自分类Dev

使用OR运算符的Excel条件

来自分类Dev

对多个值使用运算符+ =

来自分类Dev

使用Criteria API使用AND运算符进行左联接

来自分类Dev

使用逻辑运算符评估条件的多个If语句与单个语句

来自分类Dev

在方案中不使用布尔运算符的多个条件

来自分类Dev

使用三元运算符来解决多个条件

来自分类Dev

在 PHP 中的数组内使用具有多个条件的三元运算符

来自分类Dev

使用“或”运算符的T-SQL左联接

来自分类Dev

Laravel-使用OR运算符联接2个表

来自分类Dev

MSSQL:如何使用OR运算符在两列上自联接

来自分类Dev

如何在联接操作中使用类似运算符

来自分类Dev

mongodb-使用$ if运算符进行$ lookup

来自分类Dev

使用>>运算符

来自分类Dev

在条件中使用逻辑运算符和比较运算符(javascript)

来自分类Dev

将逗号运算符与条件运算符一起使用

来自分类Dev

F#:使用静态方法重载或类型条件运算符覆盖全局运算符

来自分类Dev

如何在条件记录ActiveRecord的地方使用OR运算符

来自分类常见问题

R使用管道运算符时的条件评估%>%

来自分类Dev

在选择运算符的条件下不使用合取

来自分类Dev

使用条件运算符的Angular2绑定

Related 相关文章

热门标签

归档