【问题标题】:MongoError: Write batch sizes must be between 1 and 100000. Got 0 operationsMongoError:写入批量大小必须在 1 到 100000 之间。得到 0 个操作
【发布时间】:2021-10-07 21:22:01
【问题描述】:

我是 mongodb 的新手,我尝试使用 post 方法通过我的 html 页面将数据插入数据库。我在服务器端使用猫鼬。 这是我的代码的样子。

 var LoginInfoSchema = new mongoose.Schema
 ({
     _id : String,
     user: String,
     password: String
 });


 var user = mongoose.model('user',LoginInfoSchema);

 app.post('/login', function(req, res) {
    new user({
          _id : req.body.email,
          user : req.body.user,
          password : req.body.password
            }).save(function(err,doc){
        if(err) res.json(err);
        else res.redirect('/');
    });
    mongoose.connect('mongodb://localhost:27017/UserInfo',function(err,db){
        if(err) console.log(err);
        db.collection("users").insertOne(user, function(error, result) {
        if(error) console.log(error);
        console.log("1 document inserted");
      db.close();
    });

  });
  });

每当我从 localhost html 页面插入数据时,它都会成功插入,我会从 mongo.exe 终端看到它,但我得到的错误是

名称:'MongoError', 消息:'写入批量大小必须在 1 到 100000 之间。得到 0 个操作。', 好的:0, errmsg: '写入批量大小必须在 1 到 100000 之间。得到 0 个操作。', 代码:16, 代号:'无效长度', [符号(mongoErrorContextSymbol)]:{} }

我到处搜索我无法解决的问题。具体是什么意思,请回答。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    首先我会在文件顶部和路由处理程序之外使用 mongoose.connect()。

    然后,当您使用 user.save() 时,您已经将数据保存到数据库中,并且由于回调函数,您可以处理潜在的错误或显示一些成功消息。所以 db.collection.("users").insertOne() 有点多余。

    试试这个代码可能吗? :

    mongoose.connect('mongodb://localhost:27017/UserInfo');
    
    var LoginInfoSchema = new mongoose.Schema({
      _id : String,
      user: String,
      password: String
    });
    
    var user = mongoose.model('user',LoginInfoSchema);
    
    app.post('/login', function(req, res) {
      new user({
        _id : req.body.email,
        user : req.body.user,
        password : req.body.password
      }).save(function(err,doc) {
        if(err) res.json(err);
        res.redirect('/');
      });
    });
    

    希望对你有帮助,干杯

    【讨论】:

    • 感谢您的帮助,您能描述一下 user.save() 和 insert.One() 的区别吗?
    • 您上面的代码是正确的,但我有疑问,在保存功能中您没有提到集合名称“用户”,那么它如何找到将文档保存在“用户”集合中。
    • 哦,好的,当您执行“新用户({})”时,您正在从“用户”模型创建一个新的“用户”实例。然后将 .save() 函数链接到您的实例,因此它作用于用户的模型/集合。
    【解决方案2】:

    在过去的两周里,我一直在处理这个错误,并且刚刚解决了它。 我在码头和官方 MongoDB 驱动器上使用 kotlin。 stackoverflow 中的这个链接是我得到的最接近的结果。最后,我错过了在“编码”函数末尾调用documentCodec?.encode(writer, document, encoderContext)

    下面的代码消除了错误:

    override fun encode(writer: BsonWriter?, value: User?, encoderContext: EncoderContext?) {
        document["_id"] =  value?._id
        document["name"] = value?.name
        documentCodec?.encode(writer, document, encoderContext)
    }`
    

    【讨论】:

      【解决方案3】:

      MongoDB 错误“写入批量大小必须在 1 到 100000 之间。得到 0 个操作。”尝试对无参数应用写操作的结果,例如更新零文档数组:

      db.runCommand(
         {
            update: 'some-collection',
            updates: [],   // Uh-oh, no documents!
            comment: 'this is gonna fail',
         }
      )
      

      OP 的代码导致此错误,因为对 insertOne 的调用传递给 Mongoose 构造函数 user,而不是使用 new user(...) 创建的文档。

      【讨论】:

        【解决方案4】:

        我也陷入同样的​​错误很长一段时间。上面的答案非常适合解决错误,但我也建议您检查发送给 MongoDB 连接函数的参数(对象和回调函数)的顺序。 MongoClient.connect(函数(参数))

        我们发送时从控制器到模型

        谢谢

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-10-29
          • 2017-08-17
          • 2016-03-22
          • 2013-02-04
          • 2020-11-13
          • 2019-07-29
          • 2016-03-14
          相关资源
          最近更新 更多