正在从数组中重置值

时间:2019-05-21 06:18:51

标签: mongodb mongodb-query

好的,所以我一直在尝试从通知中取消一个称为“订户”的数组的值。 Subscribers数组实际上是一堆用户的ObjectId。

我已经创建了此查询,但是我一直遇到错误,并且不确定是否正确执行了

db.notifications.update({
    subscribers:{$in:[ObjectId("51a37d82f03f08f06b000019")]}, 
    last_update:{$lte : new Date(2019, 1, 1)},
    $unset:  { "subscribers": { ObjectId("51a37d82f03f08f06b000019") }},
}).limit(10);

我遇到的错误是

  

错误:第9行:意外的令牌(

2 个答案:

答案 0 :(得分:0)

您不应该在更新上运行limit并且使用了不正确的大括号,update方法的语法至少需要两个参数:第一个参数代表查询,第二个参数代表更新操作。试试:

db.notifications.update(
    { 
        subscribers:{$in:[ObjectId("51a37d82f03f08f06b000019")]}, 
        last_update:{$lte : new Date(2019, 1, 1)} 
    },
    { $unset:  { "subscribers": ObjectId("51a37d82f03f08f06b000019") } }
)

答案 1 :(得分:0)

首先,我猜您的文档结构如下?

db.notifications.insertMany([
    { subscribers: [ObjectId(),ObjectId()], last_update: new Date()},
    { subscribers: [ObjectId(),ObjectId()], last_update: new Date()},
    { subscribers: [ObjectId(),ObjectId()], last_update: new Date()}
]);

> db.notifications.find().pretty()
{
        "_id" : ObjectId("5ce4288c4c7627b84928155f"),
        "subscribers" : [
                ObjectId("5ce4288c4c7627b849281559"),
                ObjectId("5ce4288c4c7627b84928155a")
        ],
        "last_update" : ISODate("2019-05-21T16:34:20.839Z")
}
{
        "_id" : ObjectId("5ce4288c4c7627b849281560"),
        "subscribers" : [
                ObjectId("5ce4288c4c7627b84928155b"),
                ObjectId("5ce4288c4c7627b84928155c")
        ],
        "last_update" : ISODate("2019-05-21T16:34:20.839Z")
}
{
        "_id" : ObjectId("5ce4288c4c7627b849281561"),
        "subscribers" : [
                ObjectId("5ce4288c4c7627b84928155d"),
                ObjectId("5ce4288c4c7627b84928155e")
        ],
        "last_update" : ISODate("2019-05-21T16:34:20.839Z")
}

因此,让我们从文档ObjectId("5ce4288c4c7627b849281559")_id在给定时间内找到ID为ObjectId("5ce4288c4c7627b84928155f")的订户。

> db.notifications.find({
        last_update: { $lte: dateLessThan },
        subscribers : ObjectId("5ce4288c4c7627b849281559")
    }).pretty()
{
        "_id" : ObjectId("5ce4288c4c7627b84928155f"),
        "subscribers" : [
                ObjectId("5ce4288c4c7627b849281559"),
                ObjectId("5ce4288c4c7627b84928155a")
        ],
        "last_update" : ISODate("2019-05-21T16:34:20.839Z")
}

现在,我们将其更改为使用$ pull运算符进行的更新:

> db.notifications.update({
        last_update: { $lte: dateLessThan }, subscribers : ObjectId("5ce4288c4c7627b849281559")
    }, {
        $pull: {"subscribers" : ObjectId("5ce4288c4c7627b849281559")}
    })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

现在,如果我们看一下文档,我们会注意到对象ID现在已从订阅者中删除

> db.notifications.find({"_id" : ObjectId("5ce4288c4c7627b84928155f")}).pretty()
{
        "_id" : ObjectId("5ce4288c4c7627b84928155f"),
        "subscribers" : [
                ObjectId("5ce4288c4c7627b84928155a")
        ],
        "last_update" : ISODate("2019-05-21T16:34:20.839Z")
}

但是,此查询将仅匹配一个文档,如果我们希望它更新所有符合查询条件的文档,则您需要指定{ multi: true }的选项:

db.notifications.update({...}, {...}, { multi: true })

更多阅读: 查找-https://docs.mongodb.com/manual/reference/method/db.collection.find/ 更新-https://docs.mongodb.com/manual/reference/method/db.collection.update/ $ pull-https://docs.mongodb.com/manual/reference/operator/update/pull/