我正在研究一个使用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操作符:
这个查询查找存在_id
到rooms
数组的文档,并使用$pull
从数组中删除对象。
yourModel.updateMany({
"rooms._id": {
"$in": [
"6138e21c145846ec1e38c5",
"6138e2565c145846ec1e38c5",
"6138e2b545c145846ec1e38c5"
]
}
},
{
"$pull": {
"rooms": {
"_id": {
"$in": [
"6138e21c145846ec1e38c5",
"6138e2565c145846ec1e38c5",
"6138e2b545c145846ec1e38c5"
]
}
}
}
})
例子。
你也可以像这样在没有query
参数的情况下运行你的查询(在更新查询中第一个对象是query
),结果是一样的。但是最好使用第一个对象来指示文件。