如何获取猫鼬的数据在数组中的最后一个元素?

时间:2018-07-26 05:19:16

标签: node.js mongodb mongoose

如何在猫鼬中获取数组中最后一个元素的数据? 我的数据看起来像这样:

[
    {
        "_id" : ObjectId("5b56eb3deb869312d85a8e69"),
        "transactionStatus" : [ 
            {
                "status" : "pending",
                "createdAt" : ISODate("2018-07-24T09:02:53.347Z")
            }, 
            {
                "status" : "process",
                "createdAt" : ISODate("2018-07-24T09:02:53.347Z")
            }
        ]
    },
    {
        "_id" : ObjectId("5b56eb3deb869312d8589765"),
        "transactionStatus" : [ 
            {
                "status" : "pending",
                "createdAt" : ISODate("2018-07-24T09:02:53.347Z")
            },
            {
                "status" : "process",
                "createdAt" : ISODate("2018-07-24T09:03:30.347Z")
            },
            {
                "status" : "done",
                "createdAt" : ISODate("2018-07-24T09:04:22.347Z")
            }
        ]
    }
]

而且,我想获取最后一个对象transactionStatus.status = process上方的数据,所以结果应该是:

{
    "_id" : ObjectId("5b56eb3deb869312d85a8e69"),
    "transactionStatus" : [ 
        {
            "status" : "pending",
            "createdAt" : ISODate("2018-07-24T09:02:53.347Z")
        }, 
        {
            "status" : "process",
            "createdAt" : ISODate("2018-07-24T09:02:53.347Z")
        }
    ]
}

如何用猫鼬做那件事?

2 个答案:

答案 0 :(得分:1)

您可以在比赛中使用$expr(MongoDB 3.6+)。使用$let$arrayElemAt传递-1作为第二个参数,您可以将最后一个元素作为临时变量,然后可以比较这些值:

db.col.aggregate([
    {
        $match: {
            $expr: {
                $let: {
                    vars: { last: { $arrayElemAt: [ "$transactionStatus", -1 ] } },
                    in: { $eq: [ "$$last.status", "process" ] } 
                }
            }
        }
    }
])

使用$addFields$match对于较低版本的MongoDB可以实现相同的结果。您可以先添加$project,然后删除该临时字段:

db.col.aggregate([
    {
        $addFields: {
            last: { $arrayElemAt: [ "$transactionStatus", -1 ] }
        }
    },
    {
        $match: { "last.status": "process" }
    },
    {
        $project: { last: 0 }
    }
])

答案 1 :(得分:0)

//始终使用$ position运算符更新位置0的新状态

db.update({
    "_id": ObjectId("5b56eb3deb869312d85a8e69")
},
    {
        "$push": {
            "transactionStatus": {
                "$each": [
                    {
                        "status": "process",
                        "createdAt": ISODate("2018-07-24T09:02:53.347Z")
                    }
                ],
                "$position": 0
            }
        }
    }
)

//您用于检查第一个元素的查询状态为处理中

db.find(
    {
        "transactionStatus.0.status": "process"
    }
)

推荐$position$each