Пн goose удалить поля не в схеме при чтении / поиске - PullRequest
1 голос
/ 12 марта 2020

У меня есть схема:

const LinkSchema = new mongoose.Schema({
    name: { type: String },
    style: { default: "icon", type: String },
});

И документ уже в mongoDB с потенциально большим количеством старых полей.

{
   "name": "abcLink",
   "oldThing1": true,
   "oldThing2": "oeunth",
   ....
   "oldThing100": "hi",
}

Я хочу, чтобы link.findOne({ name: "abcLink" }) вернул

{
   "name": "abcLink",
   "style": "icon"
}

В настоящее время я получаю

{
   "name": "abcLink",
   "oldThing": true,
   "style": "icon"
}

Как получить strict чтения для возврата отфильтрованного объекта, где не возвращаются поля, не определенные в схеме?

Потому что у нас более 30 активных полей и много неактивных полей, важно, чтобы мы могли определить схему один раз, а затем автоматически отфильтровать результаты. Мы не хотим дублировать действительные или недействительные поля в нескольких местах. Примечание. Использование функции типа Object.keys в схеме для получения массива допустимых полей и ее использование для фильтрации вполне допустимо.

1 Ответ

1 голос
/ 14 марта 2020

Вы можете переопределить метод toJSON, используя такую ​​функцию преобразования, чтобы в нем не было полей, не входящих в схему.

const mongoose = require("mongoose");

const LinkSchema = new mongoose.Schema({
  name: { type: String },
  style: { default: "icon", type: String }
});

var schemaFields = Object.keys(LinkSchema.paths);

LinkSchema.set("toJSON", {
  transform: function(doc, ret, options) {
    let result = {};
    Object.keys(ret).map(key => {
      if (schemaFields.includes(key)) {
        result[key] = ret[key];
      }
    });

    return result;
  }
});

module.exports = mongoose.model("Link", LinkSchema);

Обновите как @Loren, упомянутый в комментариях, для вложенные объекты мы можем использовать Object.keys(LinkSchema.tree) вместо Object.keys(LinkSchema.paths).

...