我想知道如何比较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"
}
]
答案 0 :(得分:2)
当每个数组元素需要"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
。但如果你不需要多个,因为有一个单数匹配,那么只需做单数匹配