elem匹配之间的结果不匹配,并且大于和小于mongodb

时间:2016-03-11 10:40:31

标签: mongodb date aggregation-framework

我有一个这样的文件

{
    "_id" : ObjectId("56df07927a65825b47d5e77d"),
    "internal_id" : 67627,
    "created_at" : ISODate("2015-12-14T16:10:11.015Z"),
    "updated_at" : ISODate("2016-01-16T12:40:57.328Z"),
    "name" : "DPA_Top Brands",
    "company_id" : 2,
    "ad_account_id" : 15,
    "created_time" : ISODate("2015-12-14T15:51:47.000Z"),
    "daily" : [ 
        {
            "fb_impressions" : 1335,
            "fb_clicks" : 93,
            "fb_spend" : 1098.3499999999999091,
            "timestamp" : "2015-12-16"
        }, 
        {
            "fb_impressions" : 5072,
            "fb_clicks" : 475,
            "timestamp" : "2016-01-19"
        }, 
        {
            "fb_impressions" : 322,
            "fb_clicks" : 37,
            "timestamp" : "2016-01-16"
        }
    ]
}

这不会返回上述文件

db.getCollection('ads').find({'ad_account_id': 15, 'daily': {'$elemMatch': {'timestamp': {'$lte': '2016-01-15', '$gte': '2016-01-01'}}}})

但是这会返回上面的文件

db.getCollection('ads').find({'ad_account_id': 15, 'daily.timestamp': {'$lte': '2016-01-15', '$gte': '2016-01-01'}})

以上查询显然不正确,并且不应返回数据,因为两个日期之间没有数据。

我相信它的时间戳是' 2015'这真的搞乱了,但我不明白为什么。为什么两者的结果不同?元素匹配显然是正确的。

附加输出

MongoDB shell版本:3.2.1 连接到:测试

> db.getCollection('ads').find({'ad_account_id': 15, 'daily.timestamp': {'$lte': '2016-01-15', '$gte': '2016-01-01'}})
{ "_id" : ObjectId("56df07927a65825b47d5e77d"), "internal_id" : 67627, "created_at" : ISODate("2015-12-14T16:10:11.015Z"), "updated_at" : ISODate("2016-01-16T12:40:57.328Z"), "name" : "DPA_Top Brands", "company_id" : 2, "ad_account_id" : 15, "created_time" : ISODate("2015-12-14T15:51:47Z"), "daily" : [ { "fb_impressions" : 1335, "fb_clicks" : 93, "fb_spend" : 1098.35, "timestamp" : "2015-12-16" }, { "fb_impressions" : 5072, "fb_clicks" : 475, "timestamp" : "2016-01-19" }, { "fb_impressions" : 322, "fb_clicks" : 37, "timestamp" : "2016-01-16" } ] }
> db.getCollection('ads').find({'ad_account_id': 15, 'daily': {'$elemMatch': {'timestamp': {'$lte': '2016-01-15', '$gte': '2016-01-01'}}}})
> 

提前致谢

1 个答案:

答案 0 :(得分:1)

日期比较没有错。

你不能使用具有多个查询条件的find来搜索嵌套的文档数组,理想的方法是使用$ query。 '每日'是一个数组是daily.timestamp无效。但是你可以使用&daily;。dailystamp' daily.0.timestamp'获得正确的价值。当您使用具有多个条件的查找时,如果满足任何条件,它将返回文档。