MongoDB:elemMatch匹配数组中的最后一个元素

时间:2015-07-20 11:04:40

标签: mongodb

我有以下数据:

{
"order_id" : 1234567,
"order_pay_time" : 1437373297,
"pay_info" : [
    {
        "pay_type" : 0,
        "pay_time" : 1437369046
    },
    {
        "pay_type" : 0,
        "pay_time" : 1437369123
    },
    {
        "pay_type" : 0,
        "pay_time" : 1437369348
    }
]}

我想要获得的是最后一笔付款属于类型1,但$elemMatch只匹配pay_type:1所在的列表,如何匹配上次付款的订单"pay_type" : 1 < / p>

2 个答案:

答案 0 :(得分:0)

您可以使用in this example来获得预期的输出。查询如下:

pay_info.pay_time

此外,如果您想要最新的sort,那么您可以limit按降序排列db.collection.aggregate({ $unwind: "$pay_info" }, { $match: { "pay_info.pay_type": 1 } }, { $sort: { "pay_info.pay_time": -1 } }, { $limit: 1 }, { $group: { _id: "$_id", "pay_info": { $push: "$pay_info" }, "order_id": { $first: "$order_id" }, "order_pay_time": { $first: "$order_pay_time" } } }) 1,有些内容如下:

db.collection.aggregate({

    $match: {
    "pay_info": {
        $elemMatch: {
            "pay_type": 1
        }
    }
    }
}, {
    $sort: {
    "pay_info.pay_time": -1
    }
}, {
    $limit: 1
}, {
    $redact: {
    $cond: {
        if: {
            $eq: [{
                "$ifNull": ["$pay_type", 1]
            }, 1]
        },
        then: "$$DESCEND",
        else: "$$PRUNE"
    }
    }
}).pretty()

修改

此外,您可以使用aggregation来避免$ unwind,如下所示:

Rtf

答案 1 :(得分:0)

刚刚发现了这个问题我遇到了类似的问题。

我最终做到了这一点,也许这对某人会感兴趣:

db.collection.find({
    $where: function(){
        return this.pay_info[this.pay_info.length-1].pay_type === 1
    }
})