Mongoose:拆分记录数组

时间:2018-06-15 12:09:38

标签: javascript mongoose model schema

我已经定义了一个mongoose“Event”模型,该模型应该处理用户定义事件的存储。 “事件”模式的一个属性是注册。 “注册”旨在保存关于“注册”到事件的用户的信息。另一个属性是“限制”,这个数字表示有多少注册是可能的。

即使已经超过“限制”,我也希望“注册”成为可能。但是,在这种情况下,我想在从“事件”中检索记录时生成“等待列表”。等待列表应包含在超出“限制”之后创建的所有注册。

在我当前的实现中,我在事件模式上有一个“视图”方法,即将“分割”(如果已定义限制)注册列表分成两个不同的数组:“registrations”和“waitingList”。

我的问题是:创建“视图”方法是否是解决定义注册等待列表问题的正确方法?要使此实现起作用,创建的注册的顺序必须与创建它们的顺序相同。使用更改注册顺序的查询会产生什么后果?

另一种方法可能是在查询记录时创建等待列表。但是我不知道在这种情况下如何正确地将注册数组拆分成两个不同的数组。

import mongoose, { Schema } from 'mongoose';

const registrationSchema = new Schema(
  {
    user: {
      type: Schema.ObjectId,
      ref: 'User'
    },
    createdAt: {
      type: Date,
      default: Date.now,
      expires: 3600
    }
  },
);

const eventSchema = new Schema(
  {
    title: {
      type: String,
      required: true
    },
    limit: {
      type: Number
    },
    description: {
      type: String
    },
    author: {
      type: Schema.ObjectId,
      ref: 'User',
      index: true
    },
    start: {
      type: Date,
      required: true
    },
    end: {
      type: Date,
      required: true
    },
    registrations: [registrationSchema]
  },
  {
    timestamps: true,
    toJSON: {
      virtuals: true,
      transform: (obj, ret) => {
        delete ret._id;
      }
    }
  }
);

eventSchema.methods = {
  view(full) {

    let registrations;
    this.registrations = this.registrations.reverse();
    if(this.limit) {
      registrations = {
        limit: this.limit,
        registrations: this.registrations.slice(0, this.limit),
        waitingList: this.registrations.slice(this.limit)
      }
    } else {
      registrations = {
        registrations: this.registrations
      }
    }

    const view = {
      // simple view
      id: this.id,
      title: this.title,
      description: this.description,
      author: this.author.view(full),
      start: this.start,
      end: this.end,
      ...registrations,
      createdAt: this.createdAt,
      updatedAt: this.updatedAt
    };

    return full
      ? {
          ...view
          // add properties for a full view
        }
      : view;
  }
};

0 个答案:

没有答案