我有一个这样的文件
{
"_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'}}}})
>
提前致谢
答案 0 :(得分:1)
日期比较没有错。
你不能使用具有多个查询条件的find来搜索嵌套的文档数组,理想的方法是使用$ query。 '每日'是一个数组是daily.timestamp无效。但是你可以使用&daily;。dailystamp' daily.0.timestamp'获得正确的价值。当您使用具有多个条件的查找时,如果满足任何条件,它将返回文档。