猫鼬查询父对象和子对象,然后更新子对象



我的数据结构如下

[
{
"_id": "642e9f78abebcdd68147d6aa",
"name": "test two",
"priority": 0,
"users": [
{
"admin": true,
"role": 3,
"_id": "642aa3df4add92f56fe8caab"
},
{
"admin": false,
"role": 1,
"_id": "642bf3865808d8888a1995b4"
}
],
"createdAt": "2023-04-06T10:31:20.033Z",
"updatedAt": "2023-04-06T10:31:27.863Z",
"__v": 0
}
]

我想通过id ("_id"; "642e9f78abebcdd68147d6aa")找到项目

然后通过id ("_id"; "642aa3df4add92f56fe8caab")查找用户

并更新用户。

我试图找到done并更新

const projects = await Project.findOneAndUpdate(
{
_id: projectId,
"users._id": user._id,
},
{
$set: {
users: update,
},
}
);

但是,这种方法更新整个"用户"。数组,而不是只有一个匹配搜索的特定数组。

我的下一个尝试是:

const projects = await Project.findOneAndUpdate(
{ projectId },
{ $set: { users: update } },
{ arrayFilters: [{ "users._id": user._id }] }
);
然而,这给了我以下错误
MongoServerError: The array filter for identifier 'users' was not used in the update { $setOnInsert: { createdAt: new Date(1680862292699) }, $set: { users: [ { admin: false, role: 3, _id: ObjectId('642fec54b0a5eea143444e16') } ], updatedAt: new Date(1680862292699) } }

您可以像下面这样使用$elemMatch,并在猫鼬查询中使用该对象。我想这会对你有帮助。

{
_id:"642e9f78abebcdd68147d6aa",
users: { $elemMatch: { _id:"642aa3df4add92f56fe8caab"}
}

更多关于$elemMatch的说明请访问此链接https://www.mongodb.com/docs/manual/reference/operator/query/elemMatch/

我已经找到了答案,要更新这样的嵌套文件,您可以使用以下命令:

const projects = await Project.findOneAndUpdate(
{
_id: projectId,
"users._id": user._id,
},
{
$set: { "users.$": { ...update, _id: user._id } },
},
{
new: true,
}
);

最新更新