mongodb通过id查找文档,然后根据名称字段对结果进行分组

时间:2018-04-28 20:34:27

标签: mongodb mongodb-query aggregate

我有一个包含多个文档的集合,例如

{
    "_id" : ObjectId("5a64d076bfd103df081967ae"),
    "status" : "",
    "Number" : 53,
    "values" : [ 
        {
            "date" : "2015-05-18",
            "value" : 12.41
        },
        {
            "date" : "2015-05-19",
            "value" : 12.45
        },

    ],
    "Name" : "ABC Banking",
    "scheme":"ABC1",
    "createdDate" : "21-01-2018"
}

{
    "_id" : ObjectId("5a64d076bfd103df081967ae"),
    "status" : "",
    "Number" : 53,
    "values" : [ 
        {
            "date" : "2015-05-18",
            "value" : 13.41
        },
        {
            "date" : "2015-05-19",
            "value" : 13.45
        },

    ],
    "Name" : "ABC Banking",
    "scheme":"ABC2",
    "createdDate" : "21-01-2018"
}

我正在根据数字字段查询集合,如

db.getCollection('mfhistories').find({'Number':53})

获取具有此编号的所有文件。

现在我想将名为'ABC Banking'的所有集合分组到一个数组中。这样我就可以根据姓名获得结果。

所以结果应该像

{        
   "Name":"ABC Banking",
   [
     {
        "_id" : ObjectId("5a64d076bfd103df081967ae"),
        "status" : "",
        "Number" : 53,
        "values" : [ 
            {
                "date" : "2015-05-18",
                "value" : 13.41
            },
           {
               "date" : "2015-05-19",
               "value" : 13.45
           }, 
        ],
            "scheme":"ABC1",
            "createdDate" : "21-01-2018"
       },
       {
            "_id" : ObjectId("5a64d076bfd103df081967ae"),
            "status" : "",
            "Number" : 53,
            "values" : [ 
            {
               "date" : "2015-05-18",
               "value" : 13.41
            },
            {
               "date" : "2015-05-19",
               "value" : 13.45
            }
           ], 
          "scheme":"ABC2",
           "createdDate" : "21-01-2018"
         }
    ]
}

请帮助..

谢谢, Ĵ

2 个答案:

答案 0 :(得分:1)

您可以使用聚合框架:

db.col.aggregate([
    {
        $match: { Number: 53, Name: "ABC Banking" }
    },
    {
        $group: {
            _id: "$Name",
            docs: { $push: "$$ROOT" }
        }
    },
    {
        $project: {
            Name: "$_id",
            _id: 0,
            docs: 1
        }
    }
])

$$ROOT是一个捕获整个文档的特殊变量。更多here

答案 1 :(得分:0)

db.mfhistories.aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $match: {
                Number: 53
            }
        },

        // Stage 2
        {
            $group: {
                _id: {
                    Name: '$Name'
                },
                docObj: {
                    $addToSet: '$$CURRENT'
                }
            }
        },

        // Stage 3
        {
            $project: {
                Name: '$_id.Name',
                docObj: 1,
                _id: 0
            }
        }

    ]


);