Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 在嵌入的子文档下插入新对象_Mongodb_Mongoose_Mongodb Query_Mongoose Schema - Fatal编程技术网

Mongodb 在嵌入的子文档下插入新对象

Mongodb 在嵌入的子文档下插入新对象,mongodb,mongoose,mongodb-query,mongoose-schema,Mongodb,Mongoose,Mongodb Query,Mongoose Schema,这是我的样本记录: 上图中突出显示的建筑id具有子文档网关。 我能够找到建筑id,但不确定如何在网关子文档下推送/插入新的对象网关 这是我的正文,用于从请求中插入新的网关对象 { "gatewayName": "gatewayName", "gatewayKey": "sampleKey", "suite": "3300" } 这就是我目前正在尝试的。它返回相同的文档。 首先我找到了账户,然后开始建设。然后根据提供的buildingId查找建筑。 在那里,我需要在Ga

这是我的样本记录:

上图中突出显示的建筑id具有子文档网关。 我能够找到建筑id,但不确定如何在网关子文档下推送/插入新的对象网关

这是我的正文,用于从请求中插入新的网关对象

{
    "gatewayName": "gatewayName",
    "gatewayKey": "sampleKey",
    "suite": "3300"
}
这就是我目前正在尝试的。它返回相同的文档。
首先我找到了账户,然后开始建设。然后根据提供的buildingId查找建筑。 在那里,我需要在Gateways子文档下插入一个新的gateway对象

   const account = await Account.findOne({ _id: new ObjectId(req.query.id) });
      const allBuildings = account.buildings;
      const filteredBuildings = _.filter(allBuildings, { _id: ObjectId(req.query.buildingId) });
      const gateways = _.flatMap(filteredBuildings, b => b.gateways);

      gateways.push({
        "gatewayName": "TD Bank Tower22223",
        "gatewayKey": "sdasdasdasd",
                  "suite": "3300"
      }
      );
      const updatedAccount = await account.save();
      console.log(updatedAccount)
res.json(updatedAccount);

是的,您可以使用和运算符在单个
findOneAndUpdate
中进行查找和更新

数组中文档id和建筑id的第一个匹配项。 然后,您可以使用
$
操作符访问匹配的建筑,并使用
$addToSet
插入新的阵列元素

示例:

const gateway = {
    "gatewayName": "gatewayName",
    "gatewayKey": "sampleKey",
    "suite": "3300"
};

const update = await Account.findOneAndUpdate(
    {
        _id: new ObjectId(req.query.id),
        buildings: {$elemMatch: {_id: {$eq: ObjectId(req.query.buildingId)}}}
    },
    {
        $addToSet: {"buildings.$.gateways": gateway}
    },
    {
        new: true
    }
);

我能够使用更简单的方法挖掘子文档。 我在这里张贴答案,以便其他人可以使用它

如果要查找嵌入的子文档:

var gateway = account.buildings.id(req.params.buildingId).gateways.id(req.params.gatewayId);
使用.id(_id)有助于更快地按id查找对象

如果要从深度嵌套的子文档中删除对象,请执行以下操作:

account.buildings.id(req.params.buildingId).gateways.id(req.params.gatewayId).devices.pull(req.params.deviceId);
上面将删除该元素。然后只需使用
collectionName.save()保存文档