Запрос составного первичного ключа в mongodb - PullRequest
1 голос
/ 03 февраля 2020

У меня есть коллекция 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 Ответ

2 голосов
/ 03 февраля 2020

При запросе составного первичного ключа _id mon go, похоже, ищет только точные совпадения (по существу, обрабатывает _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 и составные первичные ключи содержит еще несколько деталей.

...