Javascript 使用条件减少mongodb聚合

Javascript 使用条件减少mongodb聚合,javascript,mongodb,aggregation-framework,reduce,Javascript,Mongodb,Aggregation Framework,Reduce,我有一个名为“extra”的对象数组,它们具有不同的属性:有些对象具有“plus”,有些则没有。 我想在这个“额外”数组中创建两个不同的数组,一个称为“廉价”数组,其中包含所有不具有“加”属性的对象,另一个称为“exp”数组,其中仅包含具有“加”属性的对象。 我想我可以在mongodb聚合中使用$reduce方法和$concatarray,并使用$cond检查属性plus是否存在。 诸如此类: 数据示例: { extra: [ { descript

我有一个名为“extra”的对象数组,它们具有不同的属性:有些对象具有“plus”,有些则没有。 我想在这个“额外”数组中创建两个不同的数组,一个称为“廉价”数组,其中包含所有不具有“加”属性的对象,另一个称为“exp”数组,其中仅包含具有“加”属性的对象。 我想我可以在mongodb聚合中使用$reduce方法和$concatarray,并使用$cond检查属性plus是否存在。 诸如此类:

数据示例:

{
    extra: [
        {
            description: "laces",
            type: "exterior",
            plus: '200'
        },
        {
            description: "sole",
            type: "interior"
        },
        {
            description: "logo",
            type: "exterior"
        },
        {
            description: "stud",
            type: "exterior",
            plus: '450'
        }
    ],
}
它不起作用…我尝试了很多方法,或者写了$cond部分,但运气不好。 我想不出来。 谢谢大家。
K.

除了一些小的语法问题之外,还有一个问题是您对
$ne
运算符的理解

在这种情况下,您希望缺少的值等于
null
,这不是Mongo的工作方式。因此,对于一份文件:

{ name: "my name" }
聚合查询:

{$cond:{$eq:[“$missingField”,null]}

将不会如您所期望的那样为true,因为missing不等于
null
。我冒昧地修复了您遇到的语法问题,这条工作管道就是一条出路:

db.collection.aggregate([
  {
    $project: {
      extra: {
        $reduce: {
          input: "$extra",
          initialValue: {
            cheap: [],
            exp: []
          },
          in: {
            cheap: {
              "$concatArrays": [
                "$$value.cheap",
                {
                  $cond: [
                    "$$this.plus",
                    [],
                    [
                      "$$this"
                    ],
                    
                  ]
                }
              ]
            },
            exp: {
              "$concatArrays": [
                "$$value.exp",
                {
                  $cond: [
                    "$$this.plus",
                    [
                      "$$this"
                    ],
                    []
                  ]
                }
              ]
            }
          }
        },
        
      },
      
    },
    
  }
])


<>请注意,<代码> $COND >评估<代码> Plus 字段,这意味着如果字段确实存在“<代码> null <代码>值或<代码> 0代码/>值,那么它将考虑该文件与Pux数组的匹配。如果可能的话,这是一件需要考虑和改变的事情。请提供至少一些记录,说明你收集的数据是什么。谢谢你的解释。
db.collection.aggregate([
  {
    $project: {
      extra: {
        $reduce: {
          input: "$extra",
          initialValue: {
            cheap: [],
            exp: []
          },
          in: {
            cheap: {
              "$concatArrays": [
                "$$value.cheap",
                {
                  $cond: [
                    "$$this.plus",
                    [],
                    [
                      "$$this"
                    ],
                    
                  ]
                }
              ]
            },
            exp: {
              "$concatArrays": [
                "$$value.exp",
                {
                  $cond: [
                    "$$this.plus",
                    [
                      "$$this"
                    ],
                    []
                  ]
                }
              ]
            }
          }
        },
        
      },
      
    },
    
  }
])