我有一个mongodb集合,其中文档以以下格式存储
{
"_id": {
"host_ip": "192.41.15.161",
"date": "2020-02-02T08:18:09.207Z"
},
"path": "/apache_pb.gif",
"request": "GET /apache_pb.gif HTTP/1.0",
"status": 200
}
其中“ host_ip”和“ date”应为复合主键(即(唯一)在一起),并且存在一个_id索引,我认为该索引是基于这两个字段创建的
那么,如何才能同时基于host_ip和日期进行查询,以便可以利用“ _id”索引?
尝试使用
db.collection.find({_id: {host_ip: "192.41.15.161", date: {$gte: ISODate('2020-02-02T08:00:00:00.000Z')}}})
,但它不起作用,甚至不返回应匹配的记录。这不是正确的查询方式吗?
查询方式
db.collection.find({"_id.host_ip": "192.41.15.161", "_id.date": {$gte: ISODate('2020-02-02T08:00:00:00.000Z')}})
有效,但未使用在“ _id”上创建的索引
答案 0 :(得分:2)
查询_id
复合主键时,mongo似乎仅查找完全匹配(本质上将_id
视为字符串),因此当您查询_id: {a: x, $gte: y}
时,它将寻找"{a: x, $gte: y}"
,并且不允许按对象的任何部分进行查询。
> db.test.insert({_id: {a: 1, b: 2}});
WriteResult({ "nInserted" : 1 })
> db.test.find({_id: {a: 1}}); // no results
> db.test.find({_id: {a: 1, b: {$eq: 2}}}); // no results
就解决问题而言,我可能会在您关心的字段上设置一个新的唯一复合索引,而完全忽略_id
字段。