javascript-查询比较对象数组

我想知道如何比较猫鼬中(嵌套)对象的数组.

考虑以下数据,当名称属性匹配时,我想获得结果.有人可以帮我吗?

    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) } }
  ]
})

因此,只需将值和属性映射为“ match”到“ id”值即可.这是一个简单的“dot notation”表格,当每个数组元素都具有一个要测试/匹配的条件时,通常就足够了.

通常,对于给定的数据,这是最合乎逻辑的方法,您应该应用其中哪一种实际上适合您所需的数据条件.对于“倍数”,请使用$elemMatch.但是,如果因为存在单数匹配而不需要倍数,则只需进行单数匹配

上一篇:Javascript-猫鼬:按嵌套字段排序


下一篇:Mongoose使用