Как написать запрос в mongo DB, где ключ присутствует внутри объекта объектов в нескольких позициях?

#node.js #mongodb #mongoose

#node.js #mongodb #мангуст

Вопрос:

Пример данных :

 {
"identifier": "1",
"family": "accessories",
"parent": null,
"groups": [],
"categories": [
   "A",
   "B",
   "C"
],
"enabled": true,
"value": {
            "name": [
                {
                    "locale": null,
                    "scope": null,
                    "data": "TV"
                }
            ],
            "customText": [
                {
                    "locale": "de_DE",
                    "scope": "ecommerce",
                    "data": "ABC"
                },
                {
                    "locale": "en_US",
                    "scope": "ecommerce",
                    "data": "BCD"
                },
                {
                    "locale": "fr_FR",
                    "scope": "ecommerce",
                    "data": "ASD"
                }
            ],
            "newAttribute": [
                {
                    "locale": "de_DE",
                    "scope": null,
                    "data": "asdasd"
                },
                {
                    "locale": "en_US",
                    "scope": null,
                    "data": "asd"
                },
                {
                    "locale": "fr_FR",
                    "scope": null,
                    "data": "awd"
                }
            ],
            "release_date": [
                {
                    "locale": null,
                    "scope": "ecommerce",
                    "data": "2012-03-29T00:00:00 00:00"
                }
            ],
            "targetLocales": [
                {
                    "locale": null,
                    "scope": null,
                    "data": [
                        "fr_FR"
                    ]
                }
            ]
}
}
  

Это мой образец данных, в котором у меня есть несколько документов с атрибутом value. И я хочу найти все те результаты, где locale = «de_DE». Но я не могу придумать запрос. Я очень новичок в этом MongoDB, и все, о чем я мог подумать, это :

 collection.find( $elemMatch : { value.name.locale : "de_DE" }, $elemMatch : { value.customText.locale : "de_DE" }, ...)

  

что явно не является оптимизированным способом. Может кто-нибудь помочь мне с этим?

Ответ №1:

Вы можете использовать $или-клаузел и передать все выражения, которые вы хотите сопоставить.

 const localName = "de_DE";

YourCollection.find({
  $or: [
    {
      "value.name.locale": localName 
    },
    {
      "value.customText.locale": localName 
    },
    {
      "value.newAttribute.locale": localName 
    },
   // repeat for the rest of the fields
  ]
});
  

Вот пример на mongoplayground: https://mongoplayground.net/p/5YAJQvWjMJq

Если вы хотите сопоставить документ только в том случае, если все указанные выше поля содержат "de_DE" , вы можете просто обменять $or на $and .