Мне интересно, как я могу сравнивать массивы (вложенных) объектов в Mongoose.
Учитывая приведенные ниже данные, я хотел бы получить результаты, когда свойства name
совпадают. Может ли кто-нибудь помочь мне с этим?
Organisation.find( {
$or: [
{ "category_list": { $in: cat_list } },
{ "place_topics.data": { $in: place_tops } }
]
}
)
Скажем, что это данные, хранящиеся в моем MongoDB:
"category_list": [
{
"id": "197750126917541",
"name": "Pool & Billiard Hall"
},
{
"id": "197871390225897",
"name": "Cafe"
},
{
"id": "218693881483234",
"name": "Pub"
}
],
"place_topics": {
"data": [
{
"name": "Pool & Billiard Hall",
"id": "197750126917541"
},
{
"name": "Pub",
"id": "218693881483234"
}
]
}
И пусть говорят, что это массивы, которые я хочу сравнить (почти одинаковые данные):
let cat_list = [
{
"id": "197750126917541",
"name": "Pool & Billiard Hall"
},
{
"id": "197871390225897",
"name": "Cafe"
},
{
"id": "218693881483234",
"name": "Pub"
}
]
let place_tops = [
{
"name": "Pool & Billiard Hall",
"id": "197750126917541"
},
{
"name": "Pub",
"id": "218693881483234"
}
]
Когда для каждого элемента массива требуется "несколько условий", вы фактически используете $elemMatch
, и на самом деле "нужно", иначе вы не соответствуете правильному элементу.
Поэтому, чтобы применить несколько условий, вы предпочтете создать массив условий для $or
вместо ярлыков с $in
:
Organizations.find({
"$or": [].concat(
cat_list.map( c => ({ "category_list": { "$elemMatch": c } }) ),
place_tops.map( p => ({ "place_topics": { "$elemMatch": p } }) )
)
})
Однако, если вы сделаете шаг назад и подумаете логически об этом, вы на самом деле назвали одно из свойств "id". Это, как правило, подразумевает во всей хорошей практике, что ценность фактически "уникальна".
Поэтому все, что вам действительно нужно сделать, это просто извлечь эти значения и придерживаться исходной формы запроса:
Organizations.find({
"$or": [
{ "category_list.id": { "$in": cat_list.map(c => c.id) } },
{ "place_topics.id": { "$in": place_tops.map(p => p.id) } }
]
})
Таким образом, просто сопоставляя как значения, так и свойство, чтобы "соответствовать" на значение "id"
. Это простая форма "точечной нотации", которая обычно достаточна, когда у вас есть одно условие для элемента массива для проверки/сопоставления.
Это, как правило, самый логичный подход, учитывая данные, и вы должны применить тот, который из них действительно соответствует условиям данных, которые вам нужны. Для "множественного" использования используйте $elemMatch
. Но если вам не нужно несколько, потому что существует сингулярное совпадение, то просто выполните сингулярное совпадение