如何在不知道mongodb中的父键的情况下查找特定的嵌套对象

时间:2019-05-28 17:29:12

标签: javascript mongodb mongoose

我正在使用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'})吗?

1 个答案:

答案 0 :(得分:1)

您可以利用$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"
      }
    }
  },
])

您可以看到它working here

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

我对city进行了过滤,但是我确定您知道这个主意。