我想知道如何比较 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"
}
]
最佳答案
当有 "multiple conditions"每个数组元素所需的是您实际使用 $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”
值即可。这是一个简单的 "dot notation"当每个数组元素有一个条件要测试/匹配时,这种形式通常就足够了。
这通常是给定数据的最合乎逻辑的方法,您应该应用其中的哪一种方法真正适合您需要的数据条件。对于“多次”使用 $elemMatch
.但是如果你不需要多个因为有一个单一的匹配,那么就简单地进行单一匹配
关于javascript - 查询比较对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46918920/