#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
.