如何在mongodb聚合中将动态值传递给$ in

Posted

技术标签:

【中文标题】如何在mongodb聚合中将动态值传递给$ in【英文标题】:how to pass dynamic value to $in in mongodb aggregation 【发布时间】:2021-11-23 21:59:15 【问题描述】:

我有两个系列,一个是广告系列,另一个是订单。 我必须过滤每个广告系列的订单。所以我正在做的是获取所有广告系列,然后查找符合某些特定条件的订单。

[
      
       $match:  type: 'FOLLOWUP'  
     ,
     
       $lookup: 
         from: 'orders',
         as: 'orders',
         pipeline: [
           
              $match: 
                 'status':  $in: '$activeFilter' 
              
           
         ]
       
     
]

在上面的示例中,status 包含一些特定的字符串,activeFilter 具有包含该活动的活动状态的字符串数组。 activeFilter 是一个数组,但我收到 $in 需要一个数组的错误。

任何帮助将不胜感激。

【问题讨论】:

activeFilter从何而来?你的意思是把$in: activeFilter activeFilter 是一个保存在活动中的数组,每个活动都不同,它来自活动文档,这就是为什么我在代码中写了“$activeFilter”,它不是变量。 好的。如果您的管道的第一步返回许多活动,每个活动在 activeFilter 中都有不同的元素列表,那么您希望它在 oders 匹配步骤中如何工作?它应该是所有不同 activeFilters 的 concat 吗?应该是一个特定的activeFilter吗?你可能想从这里开始docs.mongodb.com/manual/reference/operator/aggregation/lookup/… 【参考方案1】:

您正在使用聚合管道,$in 运算符在 find() 查询和聚合管道中的工作方式不同。在聚合管道中,语法如下:

 $in: [ <expression>, <array expression> ] 

所以,$in 应该有 2 个参数,其中 value 是第一个参数,array 是第二个参数。你应该像这样改变你的代码:

"$match": 
  "$expr": 
    "$in": ["$status", "$activeFilter"]
  

Working example

【讨论】:

以上是关于如何在mongodb聚合中将动态值传递给$ in的主要内容,如果未能解决你的问题,请参考以下文章

如何在VueJS中将动态鼠标滚动值作为道具传递

如何在struts 2中将迭代器索引值传递给Javascript?

如何在flex 3中将动态值作为数组集合的字段名称传递

如何在php中将div值传递给mysql查询[关闭]

如何在 swift 中将 JSON `null` 值传递给`nil` 值?

reactjs - 如何在formik中将状态值传递给初始值