匹配mongodb中的字段

时间:2017-04-03 12:42:05

标签: mongodb mongodb-query aggregation-framework

我有mongodb样本数据结果如下:

{
    "_id" : {
        "month" : 3,
        "day" : 24,
        "year" : 2017
    },
    "commodity" : [ 
        {
            "commodityId" : ObjectId("58d434c30da1364f1e2d682d"),
            "commodityStock" : "88889s"
        }
    ],
    "totalStock" : 0,
    "count" : 1.0 }

我的问题是,如何使用$ match获得月份= 3的结果? 以下是我的疑问:

db.orders.aggregate(
   [
    { $match : {_id.month : 3}},
      {
        $group : {
           _id : { month: { $month: "$createdAt" }, day: { $dayOfMonth: "$createdAt" }, year: { $year: "$createdAt" } },
            commodity : {$push : {
                                'commodityId' : "$commodity",
                                'commodityStock' : "$stock",
                            }
                        },
           totalStock: { $sum: "$stock" },
           count: { $sum: 1 }
        }
      }
   ]
)

1 个答案:

答案 0 :(得分:0)

您可以使用 $redact 管道,其中包含 $project $match 的功能这样您就可以使用 $cond 运算符的逻辑条件过滤集合中的文档,并使用特殊操作 $$KEEP 来&# 34;保持"逻辑条件为真的文档或 $$PRUNE 到"删除"条件错误的文件。

db.orders.aggregate([
    {
        "$redact": {
            "$cond": [
                { "$eq": [{ "$month": "$createdAt" }, 3]}, 
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    },
    {
        "$group": {            
            "_id": { 
                "month": { "$month": "$createdAt" }, 
                "day": { "$dayOfMonth": "$createdAt" }, 
                "year": { "$year": "$createdAt" } 
            },
            "commodity": {
                "$push": {
                    "commodityId": "$commodity",
                    "commodityStock": "$stock",
                }
            },
            "totalStock": { "$sum": "$stock" },
            "count": { "$sum": 1 }
        }
    }
])

请注意, $redact 不使用索引,它会执行收集扫描,但如果您需要利用索引,请使用 $project < / strong>和 $match 管道阶段为:

db.orders.aggregate([
    {
        "$project": {
            "createdAt": 1,
            "month": { "$month": "$createdAt" },
            "day": { "$dayOfMonth": "$createdAt" }, 
            "year": { "$year": "$createdAt" }, 
            "commodity": 1,
            "stock": 1
        }
    },
    { "$match": { "month": 3 } },
    {
        "$group": {            
            "_id": { "month": "$month", "day": "$day", "year": "$year" },
            "commodity": {
                "$push": {
                    "commodityId": "$commodity",
                    "commodityStock": "$stock",
                }
            },
            "totalStock": { "$sum": "$stock" },
            "count": { "$sum": 1 }
        }
    }
])