我有以下数据:
{
"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>
答案 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
}
})