javascript - 查询比较对象数组

标签 javascript node.js mongodb mongoose mongodb-query

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

相关文章:

node.js - Mongoose 更新文档因 findByIdAndUpdate 失败

node.js - ejs不解析User对象

javascript - 无法从 Node js中的方法返回结果

javascript - 如何处理在 Mongodb 中存储为字符串的日期?

javascript - 如何列出我域中的所有评论

javascript - 通过 Axios 向 Firebase Cloud Function 发送 POST 请求

javascript - jQuery 更新 (1.7) 打破了触摸事件的事件坐标?

javascript - 如何通过setInterval设置div元素的图片背景?

javascript - 亚马逊 s3 : How can I name a new folder after each new username?

mongodb - 有条件地评估要返回的数组元素