在mongodb中查询复合主键

时间:2020-02-03 10:44:44

标签: database mongodb mongodb-query nosql

我有一个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”上创建的索引

1 个答案:

答案 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字段。

MongoDB and composite primary keys有更多详细信息。