我的数据库中有一个包含一个由3个数组组成的字段的集合,如下所示:
use_homepage: {
home: [Array],
hidden: [Array],
archive: [Array]
}
此字段表示用户的主页。
每个数组都包含一个ObjectID,用于标识用户主页上显示的项目。
我想检查我的项目ID是否在use_homepage.home
或use_homepage.hidden
,如果是,请从匹配的数组中删除id。
我可以使用1(或2个最大)请求执行此操作,还是每次必须检入另一个阵列时是否必须发出请求?
答案 0 :(得分:0)
如果您希望最多更新一个文档,可以试试这个:
db.entities.findAndModify({
query: { $or : [
{ home: ObjectId('<HERE YOUR ID TO BE FOUND>') },
{ hidden: ObjectId('<HERE YOUR ID TO BE FOUND>') }
]},
update: { $pull: {
home: ObjectId('<HERE YOUR ID TO BE DELETED>'),
hidden: ObjectId('<HERE YOUR ID TO BE DELETED>')
}
}
});
正如您所看到的,一般情况下,您可以搜索某些值并删除其他值。
该语句返回原始匹配文档(即在执行删除之前)。如果需要修改后的文档,可以添加以下属性:
new: true
如果您搜索要更新的许多文档,此解决方案不起作用,因为findAndModify()
仅适用于与query
条件匹配的第一个文档。
答案 1 :(得分:0)
最后,我曾经提出2项要求来完成这项工作:
db.User.find({"use_homepage.home": id}, {_id: 1}).toArray(function(err, result) {
// If some users have the id in the array home
db.User.updateMany({_id: {$in: users_match_ids}}, {
$pull: {"use_homepage.home": id}
}
});
// Do the same with 'hidden' array
如果有人看到这篇文章并有更好的解决方案,我会接受它:)