MongoDB - 使用自增实现Upsert

13

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

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)

但是这两个'$'查询导致查询失败。是否可以在一条语句中完成这个操作?

2个回答

19
首先,当您提出这样的问题时,添加关于为何失败的信息(例如复制错误)非常有帮助。
您的查询失败是因为您正在将$操作符与文档覆盖混合使用。您应该对user_id和text字段也使用$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会将您的更新查询部分复制到新文档中。

2
如果您想要实现以下操作: 如果文档不存在,则插入一个新文档。 如果存在,则仅增加一个字段。 那么您可以使用$setOnInsert和$inc的组合。如果歌曲已经存在,则$setOnInsert不会执行任何操作,而$inc将增加“listened”的值。如果歌曲不存在,则它将创建一个具有“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);
  })
       

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接