Mongodb mongoose中如何从基于id的对象数组中获取一个对象

Mongodb mongoose中如何从基于id的对象数组中获取一个对象,mongodb,mongoose,Mongodb,Mongoose,我有这样的数据: { "global": { "summaryNotificationSchedule": { "weekDay": ["wednesday"] } }, "userEmail": "test1@gmail.com", "environments": [

我有这样的数据:

{
    "global": {
        "summaryNotificationSchedule": {
            "weekDay": ["wednesday"]
        }
    },
    "userEmail": "test1@gmail.com",
    "environments": [
        {
            "userPreference": {
                "summaryNotificationSchedule": {
                    "weekDay": ["friday"]
                }
            },
            "envId": "u1"
        },
        {
            "userPreference": {
                "summaryNotificationSchedule": {
                    "weekDay": ["tuesday"],
                }
            },
            "envId": "u2"
        }
    ]
}
我需要基于
envId
environments
数组中获取
userPreference
对象

尝试此操作,但返回的是完整数组,但我需要返回数组中的对象,即
userPreference

const envData = await preferencesModel.findOne({ userEmail, "environments.envId": envId }, { 'environments.$.envId': envId }).lean();

可以使用位置运算符。但要小心使用

工作

更新1

输出如您所期望的那样

[
  {
    $project: {
      environments: {
        $filter: {
          input: "$environments",
          cond: {
            $eq: [
              "$$this.envId",
              "u1"
            ]
          }
        }
      }
    }
  },
  {
    $project: {
      userPreference: {
        $ifNull: [
          {
            $arrayElemAt: [
              "$environments.userPreference",
              0
            ]
          },
          {}
        ]
      }
    }
  }
]

工作

尝试以下几点:

查找查询:

db.collection.findOne(
{
用户电子邮件:“test1@gmail.com",
},
{
环境:{
$elemMatch:{
envId:“u1”
}
}
}
)
聚合管道:

db.collection.aggregate([
{
$match:{
用户电子邮件:“test1@gmail.com"
}
},
{
$set:{
环境:{
$first:{
$filter:{
输入:“$environments”,
条件:{$eq:[“$$this.envId”,“u1”]}
}
}
}
}
},
{
$replaceWith:“$environments.userPreference”
}
])

等待首选项model.findOne({userEmail,“environments.envId”:envId},{environments.userPreference.$”:1})
它仍然返回数组,您需要
摘要通知时间表
?是的,但我只需要返回对象:
{“userPreference”:{“摘要通知时间表”:{“工作日”:[“星期二]}
这对您有帮助吗?
[
  {
    $project: {
      environments: {
        $filter: {
          input: "$environments",
          cond: {
            $eq: [
              "$$this.envId",
              "u1"
            ]
          }
        }
      }
    }
  },
  {
    $project: {
      userPreference: {
        $ifNull: [
          {
            $arrayElemAt: [
              "$environments.userPreference",
              0
            ]
          },
          {}
        ]
      }
    }
  }
]