那里
我的问题可能会让人困惑。让我进一步解释。
我有这样的聚合文档。

{
  "metric" : "user_act",
  "stream_id" : "f00001",
  "values" : {
    "likes" : 57,
    "comments" : 0,
    "shares" : 0
  }
}
{
    "metric" : "user_act",
    "stream_id" : "f00002",
    "values" : {
      "likes" : 28,
      "comments" : 0,
      "shares" : 1
    }
}

{
    "metric" : "user_act",
    "stream_id" : "t00001",
    "values" : {
      "favorites" : 5,
      "retweets" : 15
    }
}

我想计算订婚金额喜欢,评论和分享在一起。所以在计算之前,我必须在分组之前投影数据。如果没有任何默认值为0的数据,我希望将values.favorites映射到likesvalues.retweets映射到sharescomments
我尝试下面这样的投影,但是不起作用,因为$ifNull的第二行的值覆盖了第一行。
{
  $project: {
    "stream_id" : 1,
    "shares": {
      $ifNull: ["$values.retweets",0],
      $ifNull: ["$values.shares", 0]
    } ,
    "likes": {
      $ifNull: ["$values.favorites",0],
      $ifNull: ["$values.likes", 0]
    } ,
    "comments": {
      $ifNull: ["$values.replys",0],
      $ifNull: ["$values.comments", 0]
    }
  }
}

有人知道吗?提前谢谢你。
[更新]
我试图像这样投影,但在case:中不工作,如何检查字段是否存在?
{
  $project: {
    "stream_id" : 1,
      "shares": {
        $switch: {
          branches: [
            { case: {$ne: ["$values.retweets", 0]},
              then: {$ifNull: ["$values.retweets", "$values.retweets"]}
            },
            { case: {$ne: ["$values.shares", 0]},
              then: {$ifNull: ["$values.shares", "$values.shares"]}
            }
          ],
          default: 0
        }
      }
  }
}

最佳答案

您可以尝试$cond投影。

db.collection.aggregate({
  $project: {
    "stream_id" : 1,
    "shares": { $cond: [ { $eq:[ { $ifNull: [ "$values.shares", 0 ] }, 0 ] },{ $ifNull: [ "$values.retweets", 0 ] }, "$values.shares" ] },
    "likes": { $cond: [ { $eq:[ { $ifNull: [ "$values.likes", 0 ] }, 0 ] }, { $ifNull: [ "$values.favorites", 0 ] }, "$values.likes" ] },
    "comments": { $cond: [ { $eq:[ { $ifNull: [ "$values.comments", 0] }, 0 ] }, { $ifNull: [ "$values.replys", 0 ] }, "$values.comments" ] }
}})

使用$switch
db.collection.aggregate([{
  $project: {
    "stream_id" : 1,
      "shares": {
        $switch: {
          branches: [
            { case: { $ifNull: [ "$values.shares", false ] },
              then: "$values.shares"
            },
           { case: { $ifNull: [ "$values.retweets", false ] },
              then: "$values.retweets"
            }],
          default: 0
        }
      }
  }
}])

关于mongodb - Mongo投影场那场不一样,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43024819/

10-12 16:52
查看更多