Как заставить mongo проверять документы перед вставкой или обновлением в Vertx?

#javascript #mongodb #vert.x

#javascript #mongodb #vert.x

Вопрос:

Я новичок в использовании Vertx, я создаю базовый Api Rest с Vertx Mongo, используя Javascript.

Я ищу какой-нибудь способ автоматической проверки входящих документов перед вставкой или обновлением (например, что-то вроде schemas в 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);
  

Функция контроллера, вставляющая новый cat

 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.

TL; DR — Я хочу знать, есть ли какой-нибудь способ сообщить Mongo, что поле name ВСЕГДА обязательно.

Решение, которое я использовал:

 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')
});

  

Ответ №1:

В mongodb существует концепция проверки с фильтрами запросов для сбора:https://docs.mongodb.com/manual/core/schema-validation/#query-expressions

Если поле «имя» всегда обязательно, вы можете создать свою коллекцию следующим образом:

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

Комментарии:

1. Это не работает, в документе Vertx говорится, что второй аргумент createCollection — это функция (я полагаю, функция обратного вызова?). Я думаю, что Vertx использует уменьшенную версию Java-драйвера MongoDB Vertx Mongo guide . Я нашел это , но я не смог заставить это работать.

2. я не имел в виду, что это выполняется с помощью драйвера vertx mongo, вы можете просто использовать командную строку mongo. Но если вы настаиваете на запуске с драйвером vertx mongo, просто используйте функцию runCommand.

Ответ №2:

вы можете создать свою собственную схему в отдельном файле json, затем создать свой собственный метод проверки, когда контекст предоставляется вашим маршрутизатором.

Я предполагаю, что разные конечные точки имеют разную проверку.

вы также можете создать промежуточное программное обеспечение с помощью gateleen

у вас есть множество вариантов, mongoose имеет свои преимущества, но весь смысл использования mongodb не в создании схемы. Следовательно, вы можете предположить, что запрос должен содержать определенные обязательные поля для проверки.