有条件地在mongodb项目聚合中包含一个字段(_id或其他)?

时间:2016-06-20 23:12:42

标签: mongodb aggregation-framework projection

我有一个带有$ project阶段的mongodb聚合管道,我只想在条件满足的情况下包含某些字段。具体来说,我想在一个条件中排除_id并包含第二个字段' second_id'在另一个条件下。

我知道(尚未)从mongodb $项目中排除字段是不可能的,但它是否可以有条件地包含它们?

有没有办法有条件地排除_id字段?它接受0或1,但如果我想根据if语句确定0或1,该怎么办呢?怎么会这样做?

_id的伪代码:

$project: { _id: { $ifNull: [ "$user_id", 0 ] } }

这个的主要用途是使用doc.user_id作为结果_id,或者如果user_id为null,则允许mongodb创建一个新的自动增量_id。

3 个答案:

答案 0 :(得分:0)

目前还没有在$ project阶段执行此操作,但您可以使用$ redact阶段有条件地删除该字段(即您将值设置为0,就像您在示例中所做的那样。< / p>

db.collection.aggregate(
  ... matching and stuff ...
  {$project: { _id: { $ifNull: [ "$user_id", 0 ] } }},
  {$redact: {
  {$cond: {
    if: { $eq: [ "$user_id", 0 ] },
    then: '$$PRUNE',
    else: '$$DESCEND'
  }}
}

答案 1 :(得分:0)

我为此有一个窍门:

"_id": {"$cond": [{"$eq": ["$user_id", null]}, "$nonExistinField", "$user_id"]}

答案 2 :(得分:0)

也许在问这个问题时这是不可行的,但现在是。

有一种方法可以在$project阶段有条件地包括/排除特定字段。

可以使用$cond评估您的状况,然后返回'$true''$false'

{
  myConditionalField:{$cond:{
    if:{
      $eq:['$some_field','some_value']
    },
    then:'$false',
    else:'$true'
  }}
}

在这里,仅当前一阶段的myConditionalField的值与some_field相匹配时,才会投影字段some_value