2

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

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

4

1 回答 1

1

移动$sortafter $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 运算符使用以下语法按文档在磁盘上的顺序返回

长话短说,这意味着您看到的顺序不一定与它存储在数据库中的顺序一致。

于 2013-08-01T17:48:34.183 回答