$ inc在Mongoose中使用findByIdAndUpdate抛出异常

时间:2016-08-27 16:18:58

标签: javascript node.js mongoose server

你好,这是我的文件:

{
    "_id" : ObjectId("57b2d706f61d04e8d99dd983"),
    "userName" : "a",
    "password" : "v",
    "addresses" : {
        "info" : {
            "count" : {
                "userAddress" : 0,
                "vendorAddress" : 0
            }
        },
        "user" : [],
        "vendor" : []
    }
}

现在,我希望推送一个地址 供应商子文档数组将vendorAddress计数增加1 ,一气呵成对象Id 57b2d706f61d04e8d99dd983

为此,我使用以下代码与mongoose:

usersModel.findByIdAndUpdate(
  vendorId,
  {
        "$push" : {
          "addresses.vendor" : address
        },
        $inc : {
          "addresses.info.count.vendorAddress" : 1 //--------->(A)
        }
  },
  {
        "new": true,
        "select" : {
          "addresses.vendor" : 1
        }
  },
  function(error, list){
        //can return the new doc and all
  }
);

假设我的地址是一个带有供应商地址的json,那么这件事就会产生以下异常:

exception: '$inc' is empty. You must specify a field like so: {$inc: {<field>: ...}}

但是我删除了(A)的行并用相同的输入重新运行程序。现在我怀疑的是,尽管事情非常简洁直接。

请提出一些意见。 :)

2 个答案:

答案 0 :(得分:1)

感谢大家对这个问题的支持,我发现了这个错误,实际上我的架构定义有一个错误,错误是这样的:

var _info = new Schema({ //---------->(A)
  "_id" : false, // ------------> (B)
  "addresses" : {
    "count" : {
      "vendorAddress" : Number
    }
  }
});

var UserSchema = new Schema({
  "userName" : String,
  "password" : String,
  "info" : _info,
  "addresses" : {
    "vendor" : [_vendorAddresses] //----> (C)
  }
});

仅供参考:_vendorAddresses有一个完美的架构。

现在问题是等式(A)和(B),所以我调试了它,发现我正在创建一个新对象,因为它是新的Schema,如式(A)所示。所以我删除了这两行,发现它现在运行得很好。

答案 1 :(得分:-1)

我认为您应该使用update查询而不是findByIdAndUpdate

usersModel.update({"_id" : ObjectId("57b2d706f61d04e8d99dd983")}, {   $push:{"addresses.vendor":address},   $inc : {"addresses.info.count.vendorAddress" : 1}  });