【问题标题】:Using object path in $lookup mongo aggregation pipeline在 $lookup mongo 聚合管道中使用对象路径
【发布时间】:2020-04-09 01:01:34
【问题描述】:

对于今天的任务,我正在尝试在集合中聚合文档(我们称之为 collection1,在管道的一个阶段中,我尝试使用 $lookup 从另一个集合中检索文档(我们称之为 collection2)。

collection1对象模型:

{
    "field1": "value1",
    "field2": "value2"
    "field3": "value3"
}

collection2对象模型:

{
    "field1: "value1",
    "field2"; "value2",
    "field3: {
        "field31": "value31",
        "field32": "value32"
    }
}

我真正想做的是从collection2 检索文档,其中field3.field31 等于collection1s field1 的值。

我的 $lookup 阶段看起来像这样,但目前它似乎不起作用。我没有发现任何线索是否应该有效,但期待您的回复。


{
    $lookup: {
        from: "collection2",
        let: {
            "c": "$field1",
            "l": "$field2",
            "t": "$field3",
        },
        pipeline: [
            {
                $match: {
                    $expr: {
                        $and: [
                            { $eq: ["$field1", "$$c"] },
                            { $eq: ["$field2", "$$l"] },
                            { $eq: ["$field3.field31", "$$t"] },
                        ]
                    }
                },
            },
        ],
        as: "awesomejoin"
    }
}

我想避免有一个项目或一个组,然后再次展开和过滤。我的愿望是直接从比赛阶段获得记录,认为这在性能方面更好......

让我知道你对此的看法。

谢谢

【问题讨论】:

  • 值不匹配 field3.field31field3 mongoplayground.net/p/eF9Oz30NklL
  • 感谢您在这里投入的精力和时间。我不能分享实际的对象和完整的管道,但我当然可以提供更好的例子。我的问题是,对于“as”,我似乎使用了 mongo 保留关键字。 scheduled。换了名字,一切都变得生动起来。昨天工作时间过长。
  • 抱歉,无法联系到您。请尝试用一些例子和样本集来解释

标签: mongodb aggregation-framework


【解决方案1】:

请试试这个:

db.Collection1.aggregate([
   {
     $lookup:
       {
         from: "Collection2",
         localField: "field1",
         foreignField: "field3.field31",
         as: "docs"
       }
  }
])

简单的$lookup 应该很简单,不完全确定为什么要创建局部变量并在相同的变量上寻找相等,另外$unwind 将用于数组,在对象上你可以使用 @ 访问内部元素987654325@ 符号与编程语言中的符号相同。

参考: $lookup

【讨论】:

  • 为了举例,我以相同的值 fielda 为例。我实际上需要通过匹配多个字段来加入复杂的lookul管道:)。不仅是导致问题的那个
  • @AndreiTerecoasa:你不需要这样做吗:{ $eq: ["$field3.field31", "$$c"] }?而不是 { $eq: ["$field3.field31", "$$t"] } !!好像您正在检查field3.field31== field3,但您需要的是field3.field31== field1
  • 我的错误是我为字段使用了如此神秘的名称,但这并不重要。它可以是任何一种,但对我不起作用的是{ $eq: ["$field3.field31", "$$t"] }。我认为这是因为"$field3.field32" 但我无法理解它
  • @AndreiTerecoasa :很抱歉,但您呈现它的方式非常令人困惑!因此,如果您可以提供实际样本数据 + req o/p + 您的查询,那将非常容易,一个 equals 应该在那里工作,但您是否检查了 field3.field31 的数据类型是否与 collection1 的 field1field3 匹配??
  • 感谢您在这里投入的精力和时间。我不能分享实际的对象和完整的管道,但我当然可以提供更好的例子。我的问题是,对于“as”,我似乎使用了 mongo 保留关键字。 scheduled。换了名字,一切都变得生动起来。昨天工作时间过长。
猜你喜欢
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多