MongoDB findAndModify(仅当文档不存在时插入)并在插入时设置顺序

MongoDB findAndModify(仅当文档不存在时插入)并在插入时设置顺序,mongodb,Mongodb,标题很好地解释了我想做什么 仅当文档不存在时插入项目 插入更新序列时(\u id) 插入时返回文档 如果项目确实存在,则返回文档 我一直在看mongo文档 因此,我一直在尝试从中创建我的解决方案: function getNextSequence2(x) { var ret = db.service.findAndModify( { query: { name: x }, update: { $setOnInsert:{ sequence: {

标题很好地解释了我想做什么

  • 仅当文档不存在时插入项目
  • 插入更新序列时(\u id)
  • 插入时返回文档
  • 如果项目确实存在,则返回文档
我一直在看mongo文档

因此,我一直在尝试从中创建我的解决方案:

function getNextSequence2(x) {
 var ret = db.service.findAndModify(
      {
        query: { name: x },
        update: { $setOnInsert:{ sequence: { _id: 1 } }},
        new: true,
        upsert: true
      }
    );
   return ret.inc;
}
  • 插入工作并返回文档,但序列未更新
  • 如果文档存在:正确文档返回
  • 当我添加序列并更改此项时,问题出现了:

     update: { $setOnInsert:{ sequence: { _id: 1 } }},
    
    对此

      update: { $setOnInsert:{ $inc: { _id: 1 } }},
    
    我得到这个错误:

    The dollar ($) prefixed field '$inc' in '$inc' is not valid for storage.
    
    我一直在阅读stackoverflow、mongoDB文档并尝试不同的东西,我仍然不明白我做错了什么

    例如,如果我查看此查询:

    db.products.find( { qty: { $gt: 25 } } )
    
    从逻辑上讲,我的应该有效吗

    请帮我解决这个问题


    提前感谢

    您不能更改
    \u id
    ,因为它是主键,因此是不可变的。该示例(您应该已经阅读过)实际上建议使用一个“counters”集合,其中
    \u id
    用于特定的“counter”,您使用
    $inc
    维护另一个类似“count”的字段。您希望“增量”发生在每次调用上,而不仅仅是在insert上。参考: