基于MongoDB中的嵌入式数组元素创建新属性

时间:2017-12-28 10:04:18

标签: mongodb

我有这种文件

{ 
    "_id" : ObjectId("573342930348ce88ff1685f3"),
    "presences" : [
        {
            "_id" : ObjectId("573342930348ce88ff1685f2"), 
            "createdAt" : NumberLong(1458751869000) 
        }, 
        {
            "_id" : ObjectId("573342930348ce88ff1685f5"), 
            "createdAt" : NumberLong(1458751885000)
        }, 
        {
            "_id" : ObjectId("573342930348ce88ff1685f7"), 
            "createdAt" : NumberLong(1458751894000)
        }
    ]
}

如何将第一个和最后一个在线元素提取到新属性firstPresence和lastPresence?

{ 
    "_id" : ObjectId("573342930348ce88ff1685f3"),
    "firstPresence": {
        "_id" : ObjectId("573342930348ce88ff1685f2"), 
        "createdAt" : NumberLong(1458751869000) 
    },
    "lastPresence": {
        "_id" : ObjectId("573342930348ce88ff1685f7"), 
        "createdAt" : NumberLong(1458751894000)
    },
    "presences" : [
        ...
    ]
}

我想使用一次可以应用于所有文档的查询。

2 个答案:

答案 0 :(得分:2)

您需要$unwind 状态数组进行聚合。在分组之前,您可以按 createdAt 对其进行排序,以使用 $ first $ last 运算符。

db.collection.aggregate(
    [
        { $unwind: "$presences" },
        { $sort: { "presences.createdAt": 1 } },
        { 
            $group: {
                _id: "$_id",
                "presences": { $push: "$presences" },
                "lastPresence": { $last: "$presences" },
                "firstPresence": { $first: "$presences" },
            } 
        },
        { $out : "collection" }
    ])

上一个聚合管道($out)将替换现有的集合。

答案 1 :(得分:0)

根据上述描述作为解决方案,请尝试执行以下聚合查询到MongoDB shell

   db.collection.aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $project: {

                first: {
                    $arrayElemAt: ["$presences", 0]
                },
                last: {
                    $arrayElemAt: ["$presences", -1]
                },
                presences: 1
            }
        },

    ]



);