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