Mongodb为另一列查找数据和groupby

时间:2016-10-26 11:37:05

标签: mongodb aggregation-framework

    {
        "_id" : ObjectId("5763e4d6c0140edcb8731485"),
        "_class" : "net.microservice.product.domain.Product",,
        "createdAt" : ISODate("2016-06-17T11:53:58.228Z"),
        "createdBy" : "user-0",
        "modifiedAt" : ISODate("2016-06-21T06:21:47.524Z"),
        "modifiedBy" : "user-0",
"merchant" : "a746f24safa5-e96f-4281-9759-a4a02b306d77",
        "type" : DBRef("productTypes", ObjectId("575fd99236623f70c959247f")),
    "fields" : {
        "Image4" : {
            "value" : "http://i.hizliresim.com/ZdELXa.jpg",
            "detail" : {
                "revisedBy" : "CTA",
                "revisionDate" : ISODate("2016-06-21T06:21:47.204Z")
            }
        },
        "Image3" : {
            "value" : "http://i.hizliresim.com/l1WkqX.jpg",
            "detail" : {
                "revisedBy" : "CTA",
                "revisionDate" : ISODate("2016-06-21T06:21:47.204Z")
            }
        },
        "Image2" : {
            "value" : "http://i.hizliresim.com/VYMl9n.jpg",
            "detail" : {
                "revisedBy" : "CTA",
                "revisionDate" : ISODate("2016-06-21T06:21:47.204Z")
            }
        },
        "Kur" : {
            "value" : "TL",
            "detail" : {
                "revisedBy" : "CTA",
                "revisionDate" : ISODate("2016-06-21T06:21:47.204Z")
            }
        },
        "Image1" : {
            "value" : "http://i.hizliresim.com/nrWAQ0.jpg",
            "detail" : {
                "revisedBy" : "CTA",
                "revisionDate" : ISODate("2016-06-21T06:21:47.204Z")
            }
        },
    "uploadDate" : ISODate("2016-06-17T11:53:00Z"),
    "tasks" : [ ]
}

这是数据库的示例。我想获得以下数据:

- modifiedAt is before  "modifiedAt" : ISODate("2016-07-21T06:21:47.524Z"),

所以我这样做,这有效:

    db.products.find({  
'modifiedAt': 
{$lte: ISODate("2016-10-18T13:05:18.961Z"
)}  }).
count()
    14999

但我需要找到每个merchant。由于商家拥有大量产品,因此14999结果不正确,因此14999包含多种产品。

我需要按商家分组并且不同。我无法做到。

我这样做但是

db.products.
aggregate([ { 
$group: { 
_id: '$merchant', } }, {
$match: {
modifiedAt:
 {$lte: ISODate("2016-06-18T13:05:18.961Z")} }} ])

没有任何错误,也没有错误。

2 个答案:

答案 0 :(得分:1)

你可以尝试这样的事情。这为您提供了商家的产品数量。

db.products.aggregate([ 
    {$match: {modifiedAt:{$lte: ISODate("2016-06-21T06:21:47.524Z")}}},
    {$group: { _id: "$merchant",count: { $sum: 1 }}}
])

输出:

{ "_id" : "a89846f24safa5-e96f-4281-9759-a4a02b306d77", "count" : 1 }

答案 1 :(得分:0)

始终尽早将$match放在汇总管道中。由于$ match限制了聚合管道中的文档总数,因此早期的$ match操作可以最大限度地减少管道的处理量。

所以你的查询就像

db.products.aggregate([
  {
    $match: {
      modifiedAt: {
        $lte: ISODate("2016-06-18T13:05:18.961Z")
      }
    }
  },
  {
    $group: {
      _id: '$merchant'
    }
  }
])