gpt4 book ai didi

javascript - 查询比较对象数组

转载 作者:行者123 更新时间:2023-11-30 14:58:12 26 4
gpt4 key购买 nike

我想知道如何比较 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com