MongoDB - 增量更新

发布于 2024-12-11 06:12:35 字数 277 浏览 0 评论 0原文

我正在尝试运行以下查询:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

画▽骨i 2024-12-18 06:12:35

首先,当您提出这样的问题时,添加有关失败原因的信息(例如复制错误)非常有帮助。

您的查询失败,因为您将 $ 运算符与文档覆盖混合在一起。您还应该对 user_id 和文本字段使用 $set 运算符(尽管更新中的 user_id 部分与此示例无关)。

因此,将其转换为 pymongo 查询:

db.test.update({user_id:1}, 
    {$set:{text:"Lorem ipsum", updated:new Date()}, $inc:{count:1}}, 
    true, 
    false)

我已在更新中删除了 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 the user_id part in your update is irrelevant at this example).

So convert this to pymongo query:

db.test.update({user_id:1}, 
    {$set:{text:"Lorem ipsum", updated:new Date()}, $inc:{count:1}}, 
    true, 
    false)

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.

旧城烟雨 2024-12-18 06:12:35

如果您尝试执行以下操作:
如果该文档不存在,请插入新文档。
如果存在,则只增加一个字段。
然后您可以使用 $setOnInsert 和 $inc 的组合。如果歌曲存在,那么 $setOnInsert 将不会执行任何操作,并且 $inc 将增加“已听”的值。如果歌曲不存在,那么它将创建一个包含“songId”和“songName”字段的新文档。然后 $inc 将创建该字段并将值设置为 1。

let songsSchema = new mongoose.Schema({
      songId: String,
      songName: String,
      listened: Number
    })
    
let Song = mongoose.model('Song', songsSchema);
let saveSong = (song) => {
  return Song.updateOne(
    {songId: song.songId},
    {
      $inc: {listened: 1},
      $setOnInsert: {
        songId: song.songId,
        songName: song.songName,
      }
    },
    {upsert: true}
  )
  .then((savedSong) => {
    return savedSong;
  })
  .catch((err) => {
    console.log('ERROR SAVING SONG IN DB', err);
  })
       

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.

let songsSchema = new mongoose.Schema({
      songId: String,
      songName: String,
      listened: Number
    })
    
let Song = mongoose.model('Song', songsSchema);
let saveSong = (song) => {
  return Song.updateOne(
    {songId: song.songId},
    {
      $inc: {listened: 1},
      $setOnInsert: {
        songId: song.songId,
        songName: song.songName,
      }
    },
    {upsert: true}
  )
  .then((savedSong) => {
    return savedSong;
  })
  .catch((err) => {
    console.log('ERROR SAVING SONG IN DB', err);
  })
       
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文