MongoDB - 增量更新
我正在尝试运行以下查询:
data = {
'user_id':1,
'text':'Lorem ipsum',
'$inc':{'count':1},
'$set':{'updated':datetime.now()},
}
self.db.collection('collection').update({'user_id':1}, data, upsert=True)
但是两个“$”查询导致它失败。是否可以在一个语句内完成此操作?
I am trying to run the following query:
data = {
'user_id':1,
'text':'Lorem ipsum',
'$inc':{'count':1},
'$set':{'updated':datetime.now()},
}
self.db.collection('collection').update({'user_id':1}, data, upsert=True)
but the two '$' queries cause it to fail. Is it possible to do this within one statement?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
首先,当您提出这样的问题时,添加有关失败原因的信息(例如复制错误)非常有帮助。
您的查询失败,因为您将 $ 运算符与文档覆盖混合在一起。您还应该对
user_id
和文本字段使用 $set 运算符(尽管更新中的user_id
部分与此示例无关)。因此,将其转换为 pymongo 查询:
我已在更新中删除了
user_id
,因为这是不必要的。如果文档存在,则该值已经是 1。如果不存在,upsert 会将更新的查询部分复制到新文档中。First of all, when you ask a question like this it's very helpful to add information on why it's failing (e.g. copy the error).
Your query fails because you're mixing $ operators with document overrides. You should use the $set operator for the
user_id
and text fields as well (although theuser_id
part in your update is irrelevant at this example).So convert this to pymongo query:
I've removed the
user_id
in the update because that isn't necessary. If the document exists this value will already be 1. If it doesn't exist the upsert will copy the query part of your update into the new document.如果您尝试执行以下操作:
如果该文档不存在,请插入新文档。
如果存在,则只增加一个字段。
然后您可以使用 $setOnInsert 和 $inc 的组合。如果歌曲存在,那么 $setOnInsert 将不会执行任何操作,并且 $inc 将增加“已听”的值。如果歌曲不存在,那么它将创建一个包含“songId”和“songName”字段的新文档。然后 $inc 将创建该字段并将值设置为 1。
If you're trying to do the following:
If the doc doesn't exist, insert a new doc.
If it exists, then only increment one field.
Then you can use a combo of $setOnInsert and $inc. If the song exists then $setOnInsert won't do anything and $inc will increase the value of "listened". If the song doesn't exist, then it will create a new doc with the fields "songId" and "songName". Then $inc will create the field and set the value to be 1.