Мангуста запрос на соответствие документа массиву, независимо от порядка его элементов - PullRequest
0 голосов
/ 28 января 2019

Используя MongoDB / Mongoose, рассмотрим мою коллекцию test, имеющую следующие 2 документа:

"_id" : ObjectId("5c4e3cef9cd12904cfc7ecc0"),
"name" : "REGISTER1",
"properties" : [
        {
            "property” : "PROP1",
            "value" : "GREEN"
        },
        {
            "property” : "PROP2",
            "value" : "RED"
        }
    ]

и

"_id" : ObjectId("5c4e3cef9cd12904cfc7ecc0"),
"name" : "REGISTER2",
"properties" : [
        {
            "property" : "PROP2",
            "value" : "RED"
        },
        {
            "property" : "PROP1",
            "value" : "GREEN"
        }
    ]

Я использую следующие команды для поиска регистров:

db.tests.find(
   { properties: [
            {
                "property" : "PROP2",
                "value" : "RED"
            },
            {
                "property" : "PROP1",
                "value" : "GREEN"
            }
        ]
   }).pretty();

Возвращает REGISTER2, а не REGISTER1.

Таким же образом:

db.tests.find(
   { properties: [
            {
                "property" : "PROP1",
                "value" : "GREEN"
            },
            {
                "property" : "PROP2",
                "value" : "RED"
            }
        ]
   }).pretty();

Возвращает REGISTER1, а не REGISTER2.

Мне нужно, чтобы оба запроса возвращали оба элемента 'REGISTER1' и 'REGISTER2', так как единственное изменение между ними - это порядок свойств (порядок массива).

Как запросить для возвратакак REGISTER1, так и REGISTER2, независимо от порядка массива элементов запроса?

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Для этого можно использовать запрос $all:

db.tests.find({
  properties: {$all: [
   {property: 'PROP1', value: 'GREEN'},
   {property: 'PROP2', value: 'RED'} 
]}})

Для соответствия документа должны существовать оба элемента $all, но порядок не имеет значения.

В случае, когда элементы properties содержат больше ключей, помимо того, что вы используете, вы можете использовать $elemMatch:

db.tests.find({
  properties: {$all: [
   {$elemMatch: {property: 'PROP1', value: 'GREEN'}},
   {$elemMatch: {property: 'PROP2', value: 'RED'}} 
]}})

$elemMatch гарантирует, что каждый property / value кортеж соответствует одному и тому же элементу.

0 голосов
/ 28 января 2019

Имя свойства в первом документе property_id, а во втором - property

. Пожалуйста, используйте $elemMatch с $or, чтобы получить оба соответствующих документа

db.tests.find({
    properties : {$elemMatch : {$or : [
        {"property" : "PROP1", "value" : "GREEN"},
        {"property" : "PROP2", "value" : "RED"}
    ]}}
})

коллекция образцов

> db.tests.find()
{ "_id" : ObjectId("5c4e3cef9cd12904cfc7ecc0"), "name" : "REGISTER1", "properties" : [ { "property" : "PROP1", "value" : "GREEN" }, { "property" : "PROP2", "value" : "RED" } ] }
{ "_id" : ObjectId("5c4e3cef9cd12904cfc7ecc1"), "name" : "REGISTER2", "properties" : [ { "property" : "PROP2", "value" : "RED" }, { "property" : "PROP1", "value" : "GREEN" } ] }

находка

> db.tests.find({properties : {$elemMatch : {$or : [{"property" : "PROP1", "value" : "GREEN"},{"property" : "PROP2", "value" : "RED"}]}}})
{ "_id" : ObjectId("5c4e3cef9cd12904cfc7ecc0"), "name" : "REGISTER1", "properties" : [ { "property" : "PROP1", "value" : "GREEN" }, { "property" : "PROP2", "value" : "RED" } ] }
{ "_id" : ObjectId("5c4e3cef9cd12904cfc7ecc1"), "name" : "REGISTER2", "properties" : [ { "property" : "PROP2", "value" : "RED" }, { "property" : "PROP1", "value" : "GREEN" } ] }
>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...