Limit mon goose длина схемы - PullRequest
1 голос
/ 18 марта 2020

Как я могу ограничить mon goose длиной схемы, удалить первый / самый старый элемент из схемы, когда он достигнет предела, и добавить новое значение в схему?

const mongoose = require("mongoose");

const Post = new mongoose.Schema({
  User: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true },
  Posts: { type: Object }
  Date: { type: Date, default: Date.now }
});

Как вы можете видеть выше в коде у меня есть схема сообщений, она принимает элементы без ограничений, но допустим, что я хочу ограничить ее 50 сообщениями, когда пользователь добавляет более 50 сообщений, он должен автоматически удалить / удалить первый элемент и сохранить новейшее сообщение .

Ответы [ 3 ]

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

, так как я не смог найти никакого способа решения проблемы MongoDB. вот что я сделал, чтобы добиться этого:

function newPost(post, limit) {
  Post.find({}, {}, { sort: { Date: 1 } }).then(resp => {
    if (resp.length < limit) {
      new Post(post).save();
    } else {
      Post.findByIdAndRemove(resp[0]._id).exec().catch(err => { throw err });
      new Post(post).save();
    }
  });
}
1 голос
/ 18 марта 2020

Вызов функции после определения модели в пн goose. Вы должны искать виртуальные функции в mon goose l, они вызываются после каждого изменения в вашем документе.

0 голосов
/ 18 марта 2020

Вот мое решение для String, вы должны адаптироваться к вашему случаю. Для простоты мой вектор ограничен 3, ваш случай 50, просто измените код!

require("./connection");

var mongoose = require("mongoose");

const PostSchema = new mongoose.Schema({
  User: String,
  Posts: [String] //since I am not familar with the notation { type: Array }, I have decided to work with something I am familiar with
});

PostSchema.virtual("posts").set(function(newPost) {
  if (this.Posts.length >= 3) {//change here the size to 50
    this.Posts.pop();
    this.Posts.unshift(newPost);
  } else {
    this.Posts.unshift(newPost);
  }
});

Post = mongoose.model("Post", PostSchema);

Post.findOne({ User: "Jorge Pires" }).then(post => {
  post.posts = "this is nice!";
  post.save();
  console.log(post);
});

//--------------------------------------------------------------
//uncomment for creating your first dataset sample
// Post.create({
//   User: "Jorge Pires",
//   Posts: ["Hey there", "I am on stack overflow", "this is nice"]
// });
//-----------------------------------------------------------

Как это работает?

Новые элементы войдут в спину, а самые старые будут удалены, если размер вектора превысит свой предел, мой 3 и ваш 50. Он создает «эффект пузыря», когда вы вводите новые элементы, самые старые из них автоматически перемещаются в голову и в конечном итоге будут устранены.

ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...