Mongodb 如何在mongo聚合$group$cond中使用$in或$nin

Mongodb 如何在mongo聚合$group$cond中使用$in或$nin,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我想通过在财产上拥有$或以$cond获得$sum: db.collectionName.aggregate( { "$group": { "_id":'$created_at', "count": {"$sum": 1}, "count_failure": { "$sum": { "$cond": [ { "$id": {

我想通过在财产上拥有$或以$cond获得$sum:

db.collectionName.aggregate(
{
   "$group": {
     "_id":'$created_at',
     "count": {"$sum": 1},
     "count_failure": {
         "$sum": {
           "$cond": [
               {
                 "$id":
                  { "$in": [ 0,100,101,102,103,104,105 ] }
               }, 
               1,
               0
              ] 
           }
         }
    }  
 }
)
但错误显示:
无效运算符“$id”

语法有什么问题?或者我写错了

目前,我通过以下方式实现这一目标:

db.collectionName.aggregate(
{
   "$group": {
     "_id":'$created_at',
     "count": {"$sum": 1},
     "count_failure": {
         "$sum": {
           "$cond": [
               {
                 "$or":[
                  { "$eq": [ "$id", 0 ] },
                  { "$eq": [ "$id", 100 ]},
                  { "$eq": [ "$id", 101 ]},
                  { "$eq": [ "$id", 102 ]},
                  { "$eq": [ "$id", 103 ]},
                  { "$eq": [ "$id", 104 ]},
                  { "$eq": [ "$id", 105 ]}
                 ]
               }, 
               1,
               0
              ] 
           }
         }
   }  
 }
)

我认为$in不是聚合管道操作符

首先,您应该创建一个在项目中使用的
$id
列表,然后在组中使用,如下所示:

db.collectionName.aggregate([{
  "$project": {
    "idsArray": {
      "$map": {
        "input": ["A"],
        "as": "el",
        "in": {
          "$cond": [{
              "$eq": ["$$el", "A"]
            }, "$id",
            null
          ]
        }
      }
    }
  }
}, {
  "$group": {
    "_id": "$created_at",
    "count": {
      "$sum": 1
    },
    "count_failure": {
      "$sum": {
        "$cond": [{
            "$setIsSubset": ["$idsArray", [
              0,
              100,
              101,
              102,
              103,
              104,
              105
            ]]
          },
          1,
          0
        ]
      }
    }
  }
}])
与您正在使用的
$或
条件相比,上的比较是一个较短的选项,尽管它基本上仍然适用于您正在执行的操作

$setIsSubset
的唯一特点是每个参数都是一个数组,因此需要将单个元素转换为单个元素数组。这很容易使用:

db.collectionName.aggregate([
{“$组”:{
“_id”:“$createdAt”,
“计数”:{“$sum”:1},
“计数失败”:{
“$sum”:{
“$cond”:[
{“$setIsSubset”:[
{“$map”:{
“输入”:[“A”],
“as”:“el”,
“in”:“$id”
}},
[ 0,100,101,102,103,104,105 ],
]},
1.
0
]
}
}
}}    
])
或者,如果愿意,则将参数数组与单数值匹配,替换为:

db.collectionName.aggregate([
{“$组”:{
“_id”:“$createdAt”,
“计数”:{“$sum”:1},
“计数失败”:{
“$sum”:{
“$cond”:[
{“$anyElementTrue”:{“$map”:{
“输入”:[0100101102103104105],
“as”:“el”,
“in”:{“$eq”:[“$$el”,“$id”]}
}}},
1.
0
]
}
}
}}
])
其中,
$map
是遍历参数以匹配单数,而不是将单数强制放入数组

当然,由于这两种形式本质上都是向
$cond
提供
true/false
,因此您可以在需要时使用以下方法反转逻辑:

db.collectionName.aggregate([
{“$组”:{
“_id”:“$createdAt”,
“计数”:{“$sum”:1},
“计数失败”:{
“$sum”:{
“$cond”:[
{“$not”:[{“$anyElementTrue”:{“$map”:{
“输入”:[0100101102103104105],
“as”:“el”,
“in”:{“$eq”:[“$$el”,“$id”]}
}}}]},
1.
0
]
}
}
}}
])
这实际上取决于您如何看待它,但如果只是作为提供的参数,那么使用
$或
,您就不会从原始表单中获得任何东西。它可能看起来更干净,“更容易键入”,但通常我不会直接将此类逻辑“键入”到聚合管道中,而是首先基于简单列表生成该部分结构:

i、 e

var故障列表=[0101102103104105];
var或condition=failList.map(函数(el){
返回{“$eq”:[“$id”,el]}
})
然后只需在管道定义中使用重新映射的数组内容:

{“$group”:{
“_id”:“$createdAt”,
“计数”:{“$sum”:1},
“计数失败”:{
“$sum”:{
“$cond”:[
{“$or”:或条件},
1.
0
]
}
}
}}
])

无论您以何种方式看待它,请记住,它都只是数据结构,您有基本的操作流程。管道处理内部和管道构造本身。

如何使用“$setIsSubset”而不是“$in”?语法:
{$setIsSubset:[,]}
。您需要将元素“id”放入矩阵中。但是仔细想想,我认为这不是最好的解决办法。第一种方法有点难。第二个很简单。虽然应该有easy$或in$组?希望mongo发布此功能。@SomnathMuluk我认为您的意思是“第三种方式”,考虑到所示的三种方式,并且记录在案的是,我的所有代码都是这样做的,因为这是逻辑方式。如果你想在子句中想要一个<代码> $,那么首先考虑你要把它输入到代码> $COND ,这样操作的语法到底是什么?在哪里指定要比较的字段?欢迎你发表一篇带有任何这样建议的文章。是的,我的意思是第二和第三篇文章很容易。已经有人建议@SomnathMuluk我在发表评论后注意到了这个问题,如果你觉得值得,请投票。然而,这个问题已经存在了几年,实际上早于诸如
$map
$setIsSubset
之类的运算符,因此这些运算符可以被视为当前实施的解决方案。这一问题还缺乏关于“建议”语法可能是什么的信息。这通常是最大的问题。如果您想要它,“然后询问”,并因此对所需语法提出建议。看起来,
$in
现在在聚合管道$in:[“$$id”,[0100101102,…]中的
cond
谓词中受支持,就是这样