如果匹配给定条件,如何使用mongodb 3.0.0

时间:2016-05-13 09:25:03

标签: mongodb aggregation-framework

如果匹配给定条件,我想从数组中投影所有对象。

我有以下数据

{
    _id : 1,
    em : 'abc@12s.net',
    name : 'NewName',
    od : 
    [
        {
            "oid" : ObjectId("1234"),
            "ca" : ISODate("2016-05-05T13:20:10.718Z")
        },
        {
            "oid" : ObjectId("2345"),
            "ca" : ISODate("2016-05-11T13:20:10.718Z")
        },
        {
            "oid" : ObjectId("57766"),
            "ca" : ISODate("2016-05-13T13:20:10.718Z")
        }
    ]       
},
{
    _id : 2,
    em : 'ab6c@xyz.net',
    name : 'NewName2',
    od : 
    [
        {
            "oid" : ObjectId("1234"),
            "ca" : ISODate("2016-05-11T13:20:10.718Z")
        },
        {
            "oid" : ObjectId("2345"),
            "ca" : ISODate("2016-05-12T13:20:10.718Z")
        },
        {
            "oid" : ObjectId("57766"),
            "ca" : ISODate("2016-05-05T13:20:10.718Z")
        }
    ]       
}

我想从od数组中获取所有对象,如果'od.ca'介于范围之间,如果大于10且可能小于15。

我尝试使用mongodb的聚合方法,我是这个方法的新手。我的查询如下:

db.userDetail.aggregate(
        {
            $match: 
            {
                'od.ca': 
                {
                    '$gte': '10/05/2016',
                    '$lte': '15/05/2016' 
                },
                lo: { '$ne': 'd' }
            }
        },
        {
            $redact:
            {
                $cond: 
                {
                    if: 
                    {
                        $gte: [ "$$od.ca", '10/05/2016' ],
                        $lte : ["$$od.ca" , '15/05/2016']
                    },
                    then: "$$DESCEND",
                    else: "$$PRUNE"
                }
            }
        })

当我尝试使用此命令时,收到错误: -

  

断言:命令失败:{       “errmsg”:“例外:使用未定义的变量:od”,       “code”:17276,       “好的”:0   }:聚合失败

由于我使用的是mongodb 3.0.0,因此我无法使用$fiter。所以我尝试使用$redact

有人能告诉我我在做什么错吗?查询是否正确?

  

同时提到question由于我没有使用3.2的mongodb(正如我所提到的),不能使用已接受的问题答案。

2 个答案:

答案 0 :(得分:1)

查询说明:

  1. $ match - 匹配条件文件 - 限制要处理的文件
  2. $ unwind - 从输入文档中构造 od 数组字段,以输出每个元素的文档。每个输出文档都是输入文档,数组字段的值由元素替换。
  3. $ match - 匹配标准文件
  4. $ group - 在我们的情况下,这与$ unwind相反 - 所以我们正在重新创建结果数组
  5. 如果你期待这样的文件:

    {
        "_id" : 2,
        "od" : [{
                "oid" : 1234,
                "ca" : ISODate("2016-05-11T13:20:10.718Z")
            }, {
                "oid" : 2345,
                "ca" : ISODate("2016-05-12T13:20:10.718Z")
            }
        ]
    }, {
        "_id" : 1,
        "od" : [{
                "oid" : 2345,
                "ca" : ISODate("2016-05-11T13:20:10.718Z")
            }, {
                "oid" : 57766,
                "ca" : ISODate("2016-05-13T13:20:10.718Z")
            }
        ]
    }
    

    您可以使用以下查询:

    db.userDetail.aggregate([{
                $match : {
                    "od.ca" : {
                        $lt : new Date(new Date().setDate(new Date().getDate() + 2)),
                        $gte : new Date(new Date().setDate(new Date().getDate() - 4))
                    }
                }
            }, {
                $unwind : "$od"
            }, {
                $match : {
                    "od.ca" : {
                        $lt : new Date(new Date().setDate(new Date().getDate() + 2)),
                        $gte : new Date(new Date().setDate(new Date().getDate() - 4))
                    }
                }
            }, {
                $group : {
                    _id : "$_id",
                    od : {
                        $push : "$od"
                    }
                }
            }
        ])
    

答案 1 :(得分:0)

以下查询给了我想要的结果。 如果您使用mongodb-2.6.X高达3.0.X可以使用此解决方案。



var object = {st : "10/05/2016", et : "13/05/2016"};
db.userDetail.aggregate(
  [ 
    {
      $match: 
      {
        "od.ca": 
        {
          '$gte': new Date(object.st),
          '$lte': new Date(object.et)
        },
        "lo" : {$ne : 'd'}
      }
	},
    {
        $project:
        {
			em: 1,
			fna : 1,
			lna : 1,
			ca :1,
			od:
			{
				"$setDifference":
				[{
					"$map":
					{
					  "input": "$od",
                      "as": "o",
                      "in":
                      {
                        "$cond":[
                          {
                            "$and":
                            [
                              { "$gte": [ "$$o.ca", new Date(object.st) ] },
                              { "$lte": [ "$$o.ca", new Date(object.et) ] },
                              { "$ne": [ "$$o.oid", ObjectID(config.pid.toString()) 
                                       ] }
                            ]
                          },
                          "$$o",false]
                      }
                    }
                },[false]
                ]
            }
        }
   },
   {$sort : {_id : 1}}
  ];
)




如果您使用的是3.2.X,请使用$filter来获得结果。