Mongodb检查值是否在嵌套数组中

时间:2018-02-09 09:07:27

标签: node.js mongodb node-mongodb-native

我的数据库中有一个包含一个由3个数组组成的字段的集合,如下所示:

use_homepage: {
    home: [Array],
    hidden: [Array],
    archive: [Array]
}

此字段表示用户的主页。

每个数组都包含一个ObjectID,用于标识用户主页上显示的项目。

我想检查我的项目ID是否在use_homepage.homeuse_homepage.hidden,如果是,请从匹配的数组中删除id。

我可以使用1(或2个最大)请求执行此操作,还是每次必须检入另一个阵列时是否必须发出请求?

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

如果有人看到这篇文章并有更好的解决方案,我会接受它:)