Как написать запрос, чтобы получить все документы, где поле не совпадает - PullRequest
2 голосов
/ 21 января 2020

У меня возникли проблемы при написании запроса, в котором я хочу получить все документы, в которых нет ни одного вложенного документа, где его свойство IsCurrentRevision имеет значение true. Другими словами, только получение документов, которые не имеют ни одной ревизии, помеченной как текущая.

То, что у меня пока есть:

{StartTimeUtc: {$gte: new ISODate('12/14/2019')}, 
EndTimeUtc: {$lte: new ISODate('01/21/2020')}, 
IsDeleted: false, 'MyDocument.IsCurrentRevision': false, 
"MyDocument.1.IsCurrentRevision" : {$exists: false}}

Это куда-то меня заводит, но проблема в том, что мне нужно вручную запросить индекс. В этом случае приведенный выше запрос возвращает все документы только с 1 ревизией (то есть только с одним элементом в массиве вложенных документов), чья ревизия не помечена как текущая. Таким образом, если бы я хотел получить документы, которые имеют 2 ревизии, причем вторая также помечена как ложная, мне нужно было бы обновить запрос так:

{StartTimeUtc: {$gte: new ISODate('12/14/2019')}, 
EndTimeUtc: {$lte: new ISODate('01/21/2020')}, 
IsDeleted: false, 'MyDocument.1.IsCurrentRevision': false, 
"MyDocument.2.IsCurrentRevision" : {$exists: false}}

Это очевидно утомительно, есть ли лучший способ ? Если это помогает, я использую Mon go Compass

Редактировать:

Вот как выглядит мой документ

{
  _id: Guid,
  TemplateId: guid,
  StartTimeUtc: DateTime,
  EndTimeUtc: DateTime
  ..
  ..
  SoapNoteRevisions: Array {
      _id: Guid,
      IsCurrentRevision: boolean,
      ..
      ..
    }
}

Я избавился от ненужных битов, как сам документ также содержит немало полей в ревизии (еще один подмассив)

1 Ответ

3 голосов
/ 21 января 2020

Если вам нужны документы, в которых MyDocument элементы / объекты не имеют IsCurrentRevision : true, попробуйте следующий запрос:

db.collection.find({'MyDocument.IsCurrentRevision': {$ne : true}})

Если используется агрегация:

db.collection.aggregate([{$match : {'MyDocument.IsCurrentRevision': {$ne : true}}}])

Сбор данных:

/* 1 */
{
    "_id" : ObjectId("5e27282ad02e05b69498b814"),
    "MyDocument" : [ 
        {
            "IsCurrentRevision" : false
        }, 
        {
            "IsCurrentRevision" : false
        }, 
        {
            "IsCurrentRevision" : false
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5e272839d02e05b69498b947"),
    "MyDocument" : [ 
        {
            "IsCurrentRevision" : true
        }, 
        {
            "IsCurrentRevision" : true
        }, 
        {
            "IsCurrentRevision" : true
        }
    ]
}

/* 3 */
{
    "_id" : ObjectId("5e272846d02e05b69498ba5c"),
    "MyDocument" : [ 
        {
            "IsCurrentRevision" : false
        }, 
        {
            "IsCurrentRevision" : true
        }, 
        {
            "IsCurrentRevision" : false
        }
    ]
}

Результат:

/* 1 */
{
    "_id" : ObjectId("5e27282ad02e05b69498b814"),
    "MyDocument" : [ 
        {
            "IsCurrentRevision" : false
        }, 
        {
            "IsCurrentRevision" : false
        }, 
        {
            "IsCurrentRevision" : false
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...