在mongo中使用$ inc字段进行更新会产生错误

时间:2020-04-07 02:24:08

标签: javascript mongodb mongoose mongodb-query

因此,我正在尝试更新数据库中的文件,以使其每次都增加。像一个计数器,这样我就可以不断获取更新的值。为此,我正在使用

var CounterSchema = new Schema({
  _id: String,
  _const: String,
  count: Number
});

然后我将模型创建为

const Counter = mongoose.model("counter", CounterSchema);

然后我正在使用一个函数来更新集合中的字段,例如以下内容……

async function getNextSequence() {


  var count = await Counter.findOneAndUpdate(
    { _const: "some" },

    { $inc: { count: 1 } },
    { new: true }
  );


  return count.count;
}

但是在运行上述功能时,我得到了一些错误。我确定给定的_id已存在,这是我得到的错误…

(node:10788) DeprecationWarning: Mongoose: `findOneAndUpdate()` and `findOneAndDelete()` without the `useFindAndModify` option set to false are deprecated. See: https://mongoosejs.com/docs/deprecations.html#findandmodify

9:58 PM

{ ValidationError: Url validation failed: counter: Cast to Number failed for value "Promise { <pending> }" at path "counter"

9:58 PM

at ValidationError.inspect (/rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/error/validation.js:61:24)

9:58 PM

at formatValue (internal/util/inspect.js:493:31)

9:58 PM

at inspect (internal/util/inspect.js:191:10)

9:58 PM

at Object.formatWithOptions (util.js:84:12)

9:58 PM

at Console.(anonymous function) (console.js:191:15)

9:58 PM

at Console.log (console.js:202:31)

9:58 PM

Jump Toat /app/server.js:107:39

9:58 PM

at /rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/helpers/promiseOrCallback.js:16:11

9:58 PM

at /rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/model.js:4860:21

9:58 PM

at _done (/rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/model.js:3120:16)

9:58 PM

at fn (/rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/model.js:3135:18)

9:58 PM

at callbackWrapper (/rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/model.js:3089:20)

9:58 PM

at /rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/model.js:4837:16

9:58 PM

at /rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/helpers/promiseOrCallback.js:16:11

9:58 PM

at /rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/model.js:4860:21

9:58 PM

at $__save.error (/rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/model.js:489:16)

9:58 PM

errors:

9:58 PM

{ counter:

9:58 PM

{ CastError: Cast to Number failed for value "Promise { <pending> }" at path "counter"

9:58 PM

at new CastError (/rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/error/cast.js:29:11)

9:58 PM

at model.$set (/rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/document.js:1233:9)

9:58 PM

at model._handleIndex (/rbd/pnpm-volume/f971d4d8-b5ba-4fbb-87f2-7580f1e7da53/node_modules/.registry.npmjs.org/mongoose/5.9.7/node_modules/mongoose/lib/document.js:972:14)

9:58 PM

我有一个发布api更新计数器。我已经制定了两种模式,一种用于跟踪更新,另一种用于推动实际更新计数……无论如何,我都在尝试新事物。!

app.post("/api/shorturl/new", function(req, res) {
  var url = req.body.url;
  url = url.replace(/^https?:\/\//, "");
  console.log("url string" + url);

  dns.lookup(url, async function(err, address, family) {
    if (err) {
      return console.log("error in url" + err);
    } else {
      console.log("inside else lookup");

      UrlModel.find({ url: url })
        .then(hello => {
          if (hello.length == 0) {
            console.log("url length is 0");
            console.log("url length is 0" + getNextSequence());

            UrlModel.create({ url: url, counter: getNextSequence() }, function(
              err,
              url
            ) {
              if (err) return console.log(err);
              else return res.json({ success: url });
            });
          } else {
            console.log("not 0");
            //           return the index of the sored file
          }
        })
        .catch(message => {
          console.log("error message catch" + message);
        });


    }
});

2 个答案:

答案 0 :(得分:1)

您编写的函数的返回值是一个保证,因为等待之后

return行被执行并返回一个promise。为了解决此承诺,您还必须使用async函数包装此函数。

async function run() {
  const sequence = await getNextSequence();
  console.log(sequence);
}

run();

现在您将得到想要的。

答案 1 :(得分:0)

您已将ListNode* p; if(p->pre) p->pre->nxt = p->nxt; if(p->nxt) p->nxt->pre = p->pre; p->nxt = p->pre = NULL; delete p; 定义为异步函数,因此它将自动将其包装到Promise中。尝试将其更改为:

getNextSequence
相关问题