我有一个mongo集合:
/* 0 */
{
"_id" : ObjectId("51f1fcc08188d3117c6da351"),
"cust_id" : "abc123",
"ord_date" : ISODate("2012-10-03T18:30:00Z"),
"status" : "A",
"price" : 25,
"items" : [{
"sku" : "ggg",
"qty" : 7,
"price" : 2.5
}, {
"sku" : "ppp",
"qty" : 5,
"price" : 2.5
}]
}
/* 1 */
{
"_id" : ObjectId("51fa1c318188d305fcbf9f9b"),
"cust_id" : "abc123",
"ord_date" : ISODate("2012-10-03T18:30:00Z"),
"status" : "A",
"price" : 27,
"items" : [{
"sku" : "ggg",
"qty" : 7,
"price" : 2.5
}, {
"sku" : "ppp",
"qty" : 5,
"price" : 2.5
}]
}
当我按升序给出汇总查询时:
db.orders.aggregate([{
"$unwind": "$items"
}, {
"$sort": {
"price": -1
}
}, {
"$match": {}
}, {
"$group": {
"price": {
"$first": "$price"
},
"items": {
"$push": {
"sku": "$items.sku"
}
},
"_id": "$_id"
}
}, {
"$project": {
"_id": 0,
"price": 1,
"items": 1
}
}])
我得到结果:
{
"result": [{
"price": 25,
"items": [{
"sku": "ggg"
}, {
"sku": "ppp"
}]
}, {
"price": 27,
"items": [{
"sku": "ggg"
}, {
"sku": "ppp"
}]
}]
}
即它按升序排序,反之亦然。
答案 0 :(得分:1)
在$sort
之后移动$group
,因为上一次排序将在分组后丢失。
db.orders.aggregate([{
"$unwind": "$items"
}, {
"$match": {}
}, {
"$group": {
"price": {
"$first": "$price"
},
"items": {
"$push": {
"sku": "$items.sku"
}
},
"_id": "$_id"
}
}, {
"$sort": {
"price": -1
}
}, {
"$project": {
"_id": 0,
"price": 1,
"items": 1
}
}])
对于$natural
运算符,这是doc引用的。
$ natural运算符使用以下语法返回中的文档 它们存在于磁盘上的顺序
长话短说,这意味着您看到的顺序不一定与它在DB中存储的顺序一致。