如何在mongodb中获得此结果?

时间:2018-07-09 16:42:38

标签: mongodb mongodb-query aggregation-framework

我有这个数据结构:

        "_id" : "121212",
        "terms" : [
                {
                        "term" : "hi",
                        "tf" : 2
                },
                {
                        "term" : "you",
                        "tf" : 1
                }
         ]

}

并进行以下查询:

db.foo.aggregate( [
                {
                        $match : { _id : "121212" }
                },
                {
                        $project:{ terms:1 }
                },
                {
                        $unwind: "$terms"
                }
            ]).pretty();

我已经在我的数据库中得到了这个结果:

{
        "_id" : "121212",
        "terms" : {
                "term" : "hi",
                "tf" : 2
        }
}
{
        "_id" : "121212",
        "terms" : {
                "term" : "you",
                "tf" : 1
        }
}

但是有什么办法得到这样的结果吗?:

{
        "_id" : "121212",
        "term" : "hi",
        "tf" : 2
}
{
        "_id" : "121212",
        "term" : "you",
        "tf" : 1
}

我尝试使用$ replaceRoot: {newRoot: "$ terms"}构建查询,但是在我无法再选择_id字段之后。

4 个答案:

答案 0 :(得分:2)

好吧,您可以使用$map$mergeObjects来做到这一点。

[
   { "$match":{"_id":"121212"}},
   {
      "$addFields":{
         "terms":{
            "$map":{
               "input":"$terms",
               "in":{
                  "$mergeObjects":[
                     "$$this",
                     {
                        "_id":"$_id"
                     }
                  ]
               }
            }
         }
      }
   }
]

如果您确实需要解构“ terms”数组,则将$unwind: "$terms"添加到管道中。

答案 1 :(得分:1)

您可以通过在管道末端使用$project阶段来实现

db.foo.aggregate([
  { "$match" : { "_id": "121212" } },
  { "$unwind": "$terms" },
  { "$project": { "term": "$terms.term", "tf": "$terms.tf" }}
])

输出

[
  {
    "_id": "121212",
    "term": "hi",
    "tf": 2
  },
  {
    "_id": "121212",
    "term": "you",
    "tf": 1
  }
]

检查here

答案 2 :(得分:1)

您需要在$replaceRoot内使用$mergeObjects

db.foo.aggregate( [
    {
        $match : { _id : "121212" }
    },
    {
        $project:{ terms:1 }
    },
    {
        $unwind: "$terms"
    },
    {
        $replaceRoot: {
            newRoot: {
                $mergeObjects: [ { _id: "$_id" }, "$terms" ]
            }
        }
    }
]).pretty();

答案 3 :(得分:1)

只需完成选项范围:

db.foo.aggregate([
  { "$match" : { "_id": "121212" } }, // filter by "_id"
  { "$addFields": { "terms._id": "$_id" } }, // copy "_id" field into terms
  { "$unwind": "$terms" }, // flatten the "terms" array
  { "$replaceRoot": { "newRoot": "$terms" } } // move the contents of the "terms" field up to the root level
])