MongoDB通过id数组删除嵌入文档



我正在研究一个使用Mongoose的MongoDB数据库的Node.js应用程序。我一直被困在这件事上,没有提出正确的查询。

问题:

有一个名为chats的集合,其中包含嵌入文档(rooms)作为对象数组。我想删除这些嵌入文档(rooms)Ids,它们在数组中。

{
"_id": "ObjectId(6138e2b55c175846ec1e38c5)",
"type": "bot",
"rooms": [
{
"_id": "ObjectId(6138e2b55c145846ec1e38c5)",
"genre": "action"
},
{
"_id": "ObjectId(6138e2b545c145846ec1e38c5)",
"genre": "adventure"
}
]
},
{
"_id": "ObjectId(6138e2b55c1765846ec1e38c5)",
"type": "person",
"rooms": [
{
"_id": "ObjectId(6138e2565c145846ec1e38c5)",
"genre": "food"
},
{
"_id": "ObjectId(6138e2b5645c145846ec1e38c5)",
"genre": "sport"
}
]
},
{
"_id": "ObjectId(6138e2b55c1765846ec1e38c5)",
"type": "duo",
"rooms": [
{
"_id": "ObjectId(6138e21c145846ec1e38c5)",
"genre": "travel"
},
{
"_id": "ObjectId(6138e35645c145846ec1e38c5)",
"genre": "news"
}
]
}

我正在将我的ids数组转换为MongoDBObjectId,因此我可以使用这些id作为匹配标准。

const idsRoom = [
'6138e21c145846ec1e38c5',
'6138e2565c145846ec1e38c5',
'6138e2b545c145846ec1e38c5',
];
const objectIdArray = idsRoom.map((s) => mongoose.Types.ObjectId(s));

并将此查询用于聊天集合。但是它正在删除整个文档,我只想删除rooms嵌入文档,因为ids数组仅用于嵌入文档。

Chat.deleteMany({ 'rooms._id': objectIdArray }, function (err) {
console.log('Delete successfully')
})

我非常感谢你在这个问题上的帮助。

您必须在update查询中使用$pull操作符:

这个查询查找存在_idrooms数组的文档,并使用$pull从数组中删除对象。

yourModel.updateMany({
"rooms._id": {
"$in": [
"6138e21c145846ec1e38c5",
"6138e2565c145846ec1e38c5",
"6138e2b545c145846ec1e38c5"
]
}
},
{
"$pull": {
"rooms": {
"_id": {
"$in": [
"6138e21c145846ec1e38c5",
"6138e2565c145846ec1e38c5",
"6138e2b545c145846ec1e38c5"
]
}
}
}
})

例子。

你也可以像这样在没有query参数的情况下运行你的查询(在更新查询中第一个对象是query),结果是一样的。但是最好使用第一个对象来指示文件。

相关内容

  • 没有找到相关文章

最新更新