MongoDB: Найти документ, в котором ни один из вложенных документов не соответствует критериям - PullRequest
1 голос
/ 13 апреля 2020

Я хочу найти документ, где Record A имеет "FLD1", а "FLD1" не равно "VAL2", это означает, что он также должен возвращать документ, в котором либо Record A не существует, либо FLD1 не существует, кроме FLD1 не равно VAL2.

В следующем документе должно возвращаться документ 1, 3 и 4

  • 1: поскольку Record A существует, FLD1 существует, но значение FLD1 не VAL2
  • 3: потому что Record A не существует
  • 4: потому что Record A существует, но FLD1 не существует

только 2, где Record A существует, FLD1 существует и значение FLD1 равно VAL2.

{
    _id:NumberLong("1"),
    Name:"Doc1",
    Records: [ 
        {
            "RecordName" : "Record A",
            "State" : 1,
            "Properties" : {
                "FLD1" : "VAL1"
            }
        },
        {
            "RecordName" : "Record B",
            "State" : 1,
            "Properties" : {
                "FLD2" : "VAL3",
                "FLD3" : "VAL2"
            }
        }
    ]
},
{
    _id:NumberLong("2"),
    Name:"Doc2",
    Records: [ 
        {
            "RecordName" : "Record A",
            "State" : 1,
            "Properties" : {
                "FLD1" : "VAL2"
                "FLD4" : "VAL1"
                "FLD5" : "VAL6"
            }
        },
        {
            "RecordName" : "Record C",
            "State" : 1,
            "Properties" : {
                "FLD1" : "VAL1",
                "FLD2" : "VAL3"
            }
        }
    ]
},
{
    _id:NumberLong("3"),
    Name:"Doc3",
    Records: [ 
        {
            "RecordName" : "Record B",
            "State" : 0,
            "Properties" : {
                "FLD2" : "VAL2"
                "FLD3" : "VAL4"
                "FLD4" : "VAL5"
            }
        },
        {
            "RecordName" : "Record C",
            "State" : 1,
            "Properties" : {
                "FLD3" : "VAL2",
                "FLD5" : "VAL4"
            }
        }
    ]
},
{
    _id:NumberLong("4"),
    Name:"Doc4",
    Records: [ 
        {
            "RecordName" : "Record A",
            "State" : 1,
            "Properties" : {
                "FLD2" : "VAL2"
            }
        },
        {
            "RecordName" : "Record C",
            "State" : 1,
            "Properties" : {
                "FLD3" : "VAL3",
                "FLD4" : "VAL4"
            }
        }
    ]
}

Кто-нибудь знает, как написать такой запрос для mon go db?

Кроме того, если я хочу узнать все документы, где ни один из вложенных документов не имеет имя записи со значением Record B, как я узнаю?

В этом случае запрос должен вернуть документы 2 и 4.

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Похоже, вам нужен оператор $ или , охватывающий три отдельных условия фильтрации:

db.collection.find({
    $or: [
        { "Records": { $not : { $elemMatch: { "RecordName": "Record A" } } } },
        { "Records.Properties.FLD1": { $exists: false } },
        { "Records": { $not : { $elemMatch: { "Properties.FLD1": "VAL2" } } } }
    ]
})

$ elemMatch вместе с $, а не позволяет проверить, все ли Records имеют RecordName не равно Record A, тогда вы можете использовать $ существующие для проверки FLD1 и еще один $elemMatch с $not:

Пн go Детская площадка

0 голосов
/ 13 апреля 2020

Спасибо @ mickl

Мне пришлось немного изменить ответ.

{
      $nor: [
        {
          $and: [
            {
              "Records": {
                $elemMatch: {
                  "RecordName": "Record A"
                }
              }
            },
            {
              "Records.Properties.FLD1": {
                $exists: true
              }
            },
            {
              "Records": {
                $elemMatch: {
                  "Properties.FLD1": "VAL2"
                }
              }
            }
          ]
        }
      ]
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...