排序工作相反

时间:2013-08-01 17:34:14

标签: mongodb mongo-java

我有一个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"
        }]
    }]
}

即它按升序排序,反之亦然。

1 个答案:

答案 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中存储的顺序一致。