Javascript 如何让mongo在Vertx中插入或更新之前验证文档?

Javascript 如何让mongo在Vertx中插入或更新之前验证文档?,javascript,mongodb,vert.x,Javascript,Mongodb,Vert.x,我是使用Vertx的新手,我正在使用Javascript用Vertx+Mongo构建一个基本的Api Rest 我正在寻找一种在插入或更新之前自动验证传入文档的方法(例如,Mongoose中的模式) 我得到以下信息: 进入点后插入新的cat var BodyHandler = require("vertx-web-js/body_handler"); var Router = require("vertx-web-js/router"); var router = Router.router(v

我是使用Vertx的新手,我正在使用Javascript用Vertx+Mongo构建一个基本的Api Rest

我正在寻找一种在插入或更新之前自动验证传入文档的方法(例如,Mongoose中的模式)

我得到以下信息:

进入点后插入新的cat

var BodyHandler = require("vertx-web-js/body_handler");
var Router = require("vertx-web-js/router");
var router = Router.router(vertx);
router.post("/cat")
    .produces("application/json")
    .handler(BodyHandler.create().handle)
    .handler(controller.createCat);
createCat: function (ctx) {
  var response = ctx.response();
  var body = ctx.getBodyAsJson() || {};

  console.log('inserting cat')

  connection.mongoClient.insert("cats", { name: body.name }, function (res, res_err) {
    if (res_err == null) {
      var id = res;
      console.log("Inserted cat with id " + id);
      response.putHeader("content-type", "application/json");
      response.end(JSON.stringify(id));
    } else {
      console.log('err')
      res_err.printStackTrace();
    }
  });
}
控制器功能插入新的cat

var BodyHandler = require("vertx-web-js/body_handler");
var Router = require("vertx-web-js/router");
var router = Router.router(vertx);
router.post("/cat")
    .produces("application/json")
    .handler(BodyHandler.create().handle)
    .handler(controller.createCat);
createCat: function (ctx) {
  var response = ctx.response();
  var body = ctx.getBodyAsJson() || {};

  console.log('inserting cat')

  connection.mongoClient.insert("cats", { name: body.name }, function (res, res_err) {
    if (res_err == null) {
      var id = res;
      console.log("Inserted cat with id " + id);
      response.putHeader("content-type", "application/json");
      response.end(JSON.stringify(id));
    } else {
      console.log('err')
      res_err.printStackTrace();
    }
  });
}
问题是,我可以插入空文档,结果文档只有一个字段:mongo ID

TL;DR-我想知道是否有办法告诉Mongo始终需要名称字段。

我使用的解决方案:

mongoClient.runCommand("collMod", { collMod: "cats", validator: { $and: [ {"name": {$type: "string", $exists: true}} ] }, validationLevel: "strict", validationAction: "error" }, function(res, res_err) {
  if (res_err) res_err.printStackTrace()
  else console.log('The schema of cats collection has been updated')
});


在mongodb中,有一个使用查询过滤器验证集合的概念:

如果始终需要“名称”字段,则可以按如下方式创建集合:

db.createCollection("cats", {
  validator: {
    $and: [ {"name": {$type: "string", $exists: true}} ]
})

您可以在单独的json文件中创建自己的模式,然后在ur路由器提供上下文时创建自己的验证方法

我假设不同的端点具有不同的验证

您还可以使用
gateleen


您有很多选择,mongoose提供了它的好处,但使用mongodb的全部目的不是创建模式。因此,您可以假设请求应该有特定的必填字段进行验证。

它不起作用,Vertx(我想是回调函数?)。我认为Vertx使用了MongoDB Java驱动程序的一个小版本。我发现了,但我不能让它工作。我不是有意用vertx mongo驱动程序执行它,你可以简单地使用mongo命令行。但是如果您坚持使用VertxMongo驱动程序运行它,只需使用runCommand函数即可。