В mongodb, как выбрать документ, который имеет один встроенный документ, но не другой? - PullRequest
0 голосов
/ 21 августа 2011

Да, заголовок - полный рот, но это самый простой способ, которым я мог бы кратко описать проблему:

У меня есть документ, который выглядит примерно так:

{ "_id" : ObjectId("4e5044ecf9d7954533000002"), "events" : [
        {
                "state" : 1,
                "time" : 1313882989,
        },
        {
                "time" : 1313883005,
                "state" : 0,
        }
]}

Вы можете видеть, что«события» - это массив встроенных документов.состояние: 1 означает, что документ был установлен как «активный» в это время (секунды в UTC), а состояние: 0 означает, что он был установлен как «неактивный» в то время.По сути, это дает мне диапазон времени, когда этот документ был активен (от 1313882989 до 1313883005)

Теперь я пытаюсь определить, какие документы были активны в любой конкретный момент времени, например, в 1313883013, время, которое находится между активнымии неактивные события.

Я могу получить что-то с помощью этого запроса:

db.plays.find({events:{$elemMatch:{state:1,time:{$lte:1313883013}}}})

Соответствует полному встроенному документу, где состояние = 1 И время <1313883013.Однако этого недостаточно, потому что я должен убедиться, что документ <strong> также не содержит неактивное событие в 1313883013 или ранее, поэтому я попробовал это:

db.plays.find({events:{$elemMatch:{state:1,time:{$lte:1313883013}},$not:{$elemMatch:{state:0,time:{$lte:1313883013}}}}})

но безрезультатно.И я пробовал разные варианты этого тоже.

Надеюсь, я достаточно ясно дал понять, заранее спасибо за любую помощь !!

1 Ответ

0 голосов
/ 21 августа 2011

Один из простых вариантов - определить бесконечно большое время в будущем и установить для любого активного документа его время окончания. Если вы превращаете каждое событие в форму {start:12345, end:999999999}, тогда ваш запрос является простым тестом start < time < end. Когда документ больше не используется, вы просто находите событие с максимальным временем окончания и меняете его на текущее время (простое обновление).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...