好的,所以我一直在尝试从通知中取消一个称为“订户”的数组的值。 Subscribers数组实际上是一堆用户的ObjectId。
我已经创建了此查询,但是我一直遇到错误,并且不确定是否正确执行了
db.notifications.update({
subscribers:{$in:[ObjectId("51a37d82f03f08f06b000019")]},
last_update:{$lte : new Date(2019, 1, 1)},
$unset: { "subscribers": { ObjectId("51a37d82f03f08f06b000019") }},
}).limit(10);
我遇到的错误是
错误:第9行:意外的令牌(
答案 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/