当前位置: 首页 > 知识库问答 >
问题:

使用带有let和pipeline的$lookup在MongoDB中声明变量

羊舌富
2023-03-14

我正在尝试向我的网站添加一个喜欢的功能。我使用以下模式制作了一个喜欢的集合。我正在使用自定义_id来避免创建额外的索引。

{
  _id: {
    postId: ObjectId,
    userId: ObjectId
  }
}

我的服务器上有一个路由,它使用MongoDB聚合搜索帖子集合。我正在尝试向当前管道中添加一个$lookup阶段,以便添加一个liked属性,该属性的类型为布尔值,表示用户是否喜欢该帖子。下面是无法工作的$查找阶段(liked始终返回空数组,即使有相应的liked文档):

{
  $lookup: {
    from: 'likes',
    let: { likedPostId: '$_id.postId', likerUserId: '$_id.userId' },
    pipeline: [
      { $match:
        { $expr:
          { $and:
            [
              { $eq: [
                '$$likerUserId',
                  ObjectId('12345')
              ]},
              { $eq: [
                  '$$likedPostId',
                  '$_id'
              ]}
            ]
          }
        }
      }
    }
  ],
  as: 'liked'
  }
}

我认为问题在于变量实际上并没有保持我所期望的值。有没有办法解决这个问题?此外,如果你知道一种更简单的方法来实现这一点,如果你能与我分享,我将不胜感激。

我已经尝试比较两个相同的ObjectId()实例,以确保可以使用$eq运算符比较ObjectId实例。还尝试在不同的嵌套字段上定义嵌套变量,如上面代码片段中的变量。这个问题中唯一的不同之处是我试图将属性拉到_id字段之外。

P、 我知道喜欢的属性应该是数组而不是布尔值。但我正在考虑在下一阶段将其转换为布尔值。但这不是现在的问题。

共有1个答案

洪开诚
2023-03-14

反之亦然。如果您正在“喜欢”集合上运行“$查找”,则“让”部分的目标是定义引用正在运行聚合的集合的变量。另一方面,您可以在管道中使用单美元符号引用在likes集合中定义的字段。尝试:

{
    $lookup: {
        from: 'likes',
        let: { id: '$_id' },
        pipeline: [
            { $match:
                { $expr:
                { $and:
                    [
                    { $eq: [
                        '$_id.userId',
                        ObjectId('12345')
                    ]},
                    { $eq: [
                        '$_id.postId',
                        '$$id'
                    ]}
                    ]
                }
                }
            }
        ],
        as: 'liked'
    }
}

编辑:请看看文档

任选。指定要在管道字段阶段中使用的变量。使用变量表达式访问从文档输入到$查找阶段的字段。

管道无法直接访问输入文档字段。相反,首先定义输入文档字段的变量,然后引用管道中各个阶段的变量。

 类似资料:
  • 我试图表示一个树状递归数据结构,其中每个节点可能是两种不同数据类型中的一种。我使用boost变体来“容纳”可能出现在每个节点上的两种类型。 但是,我遇到了一个问题。我严格使用“using”指令声明所有这些类型,因此当我到达节点的递归性质时,它会失败,因为typedef/using可能不会使用递归。 如何做到这一点? 我已经探索过使用boost::make_recursive_variant,但它创

  • 问题内容: 我玩ES6已有一段时间了,我注意到虽然用声明的变量被按预期悬挂了… …声明或似乎存在一些问题的变量: 和 这是否意味着使用或不声明的变量被吊起?这到底是怎么回事?是否有任何区别,并在此问题? 问题答案: @thefourtheye的正确说法是在声明这些变量之前 无法访问 它们。但是,这要复杂得多。 是否用或不声明变量?这到底是怎么回事? 所有声明 (,,,,,) 被“悬挂” 在Java

  • 问题内容: 最近有人问我这在python中是什么意思: 我不知道。我以前从未见过。我检查了文档,没有类似的东西。一个人的建议是它是静态类型声明,但是在文档中也绝对没有任何内容。 有了以上,如果我 失败了 如果我可以,并且type(char)的结果是。但是它不能是静态声明,因为我可以并且type(char)变为。 所以我来这里是为了收集许多SO霸主的智慧。这意味着什么? 问题答案: 您正在查看变量的

  • 问题内容: 我正在尝试对MySQL 5.0中的变量进行一些简单的操作,但是我无法完全正常工作。我已经看到了很多(非常!)DECLARE / SET的不同语法,我不确定为什么……在任何情况下,我都可能会混淆它们/选择错误的语法/混合它们。 这是一个失败的最小片段: 我也尝试过使用BEGIN … END包装它;并作为一个程序。在这种情况下,MySQL Workbench会帮助我:第一行显示“’)’附近

  • 问题内容: 我偶然发现了一个奇怪的问题,下面的代码无法编译: 错误(代码是linter推荐的代码)。: 注意,确实使用了该变量。 但是,如果我添加了else块-一切都会按预期编译: 这看起来像是编译器中的错误,还是一个已知问题?任何想法?(我正在使用go 1.11) 编辑:到目前为止的所有被告。按照:https : //golang.org/ref/spec#Short_variable_decl

  • 我是mongoose&mongoDB的新手,我有following查询,当运行时会抛出follower错误。如果有人能帮我处理这个问题,并且仍然得到相同的输出,那就太好了