Ищите массив объектов MongoDB в любом порядке - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть коллекция mongodb с массивом объектов. Я хочу иметь возможность искать объекты в массиве в любом порядке и возвращать совпадение, только если все объекты в этом массиве найдены.

Моя коллекция:

{
    "_id" : ObjectId("5234c367354kj63c9cae4fec"),
    "field1" : "TEST",
    "created" : <DATE_HERE>,
    "field2" : [ 
        {
            "index" : "A",
            "value" : "1"
        }, 
        {
            "index" : "B",
            "value" : "2"
        }, 
        {
            "index" : "C",
            "value" : "3"
        }
    ],
}

Если я предоставлю запрос ниже, приведенный выше документ будет возвращен, поскольку все 3 объекта приведены в том порядке, в котором они хранятся.

db.collection("collection").find({field1: "TEST", field2: [{"index": "A", "value": "1"}, {"index": "B", "value": "2"}, {"index": "C", "value": "3"}]})

Тем не менее, я хочу иметь возможность найти документ выше, учитывая 3 объекта в любом порядке. Например, приведенный ниже запрос:

db.collection("collection").find({field1: "TEST", field2: [{"index": "B", "value": "2"}, {"index": "A", "value": "1"}, {"index": "A", "value": "1"}]})

Я знаю, что приведенный выше запрос не будет работать, если он вообще возможен, и в нем отсутствует правильный синтаксис / функция поиска, но он просто объясняет мой мыслительный процесс и что Я пытаюсь достичь.

Я пытался использовать поиск $in с чем-то вроде field2: {$in: [<3_objects_above>]}, но он не даст мне точного соответствия. Например, если в этой коллекции есть 2-й документ с field2: [...{"index": "Z", "value": "543"}], и он содержит только 1 из 3 объектов, показанных в 2 запросах и таблице выше, этот 2-й документ также будет возвращен, поскольку он соответствует как минимум 1 предоставленному объекту. в массиве, хотя я не предоставил объект {"index": "Z", "value": "543"}.

Есть ли способ выполнить sh предоставление объектов в массиве в любом порядке и найти документ в коллекции, который соответствует всем 3 объектам, независимо от того, в каком порядке они указаны? Совпадения все 3, а не 3 ?

1 Ответ

1 голос
/ 11 февраля 2020

Вы можете использовать оператор $ all :

db.collection.find(
   {
      field1: "TEST",
      field2: {
         $all: [
            { "index": "A", "value": "1" },
            { "index": "B", "value": "2" },
            { "index": "C", "value": "3" }
         ]
      }
   }
)   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...