首页 > 解决方案 > 如何在不知道 mongodb 中的父键的情况下查找特定的嵌套对象

问题描述

我正在使用 javascript 和 mongoose 模块。我有一个像这样的对象

my_object = {
    ShopName: String,
    employees: [String],
    info: {
        NameEmployee_1: {
            age: String,
            work: String,
            city: String,
        },

        NameEmployee_2: {
            age: String,
            work: String,
            city: String,
        }
    } 

}

我想找到所有具有特定年龄但不知道员工姓名的员工,有没有办法做到这一点?

我知道你例如我可以这样

db.collection.find({'info.Max': {$exists: true}})

查找至少有一名员工姓名为 Max 的所有商店,但如果我想要所有至少有一名员工年龄为 33 岁的商店怎么办

db.collection.find({'info.<name>.age': '33'})?

标签: javascriptmongodbmongoose

解决方案


您可以使用$ objectToArray(mongoDB 3.4.4 及更高版本)、$filter$project获得如下内容:

db.collection.aggregate([
  {
    $project: {
      obj: {
        $objectToArray: "$info"
      }
    }
  },
  {
    $project: {
      _id: 0,
      obj: {
        $filter: {
          input: "$obj",
          as: "item",
          cond: {
            $eq: [
              "$$item.v.city",
              "NY"
            ]
          }
        }
      }
    }
  },
  {
    $project: {
      info: {
        $arrayToObject: "$obj"
      }
    }
  },
])

你可以看到它在这里工作

这个想法是将对象分解为数组,对其进行过滤,然后将该数组转换回对象。

我过滤了,city但我相信你明白了。


推荐阅读