node.js 如何在 Mongoose 模式中设置数组大小限制

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/28514790/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 18:26:02  来源:igfitidea点击:

How to set limit for array size in Mongoose schema

node.jsmongodbmongoose

提问by Ignat Galkin

Would you be kind to tell me is there any way to set limitation on array size while creating Mongoose schema. For example

您能告诉我在创建 Mongoose 模式时有什么方法可以设置数组大小的限制。例如

 var peopleSchema = new Schema({
    name: {
        type: String,
        required: true,
        default: true
    },
   /* here I want to have limit: no more than 10 friends.
    Is it possible to define in schema?*/
    friends: [{
        type: Schema.Types.ObjectId,
        ref: 'peopleModel'
    }]
})

回答by Jason Cust

With a small tweak to your schema setup you can add a validateoption:

通过对架构设置进行小幅调整,您可以添加验证选项:

var peopleSchema = new Schema({
  name: {
    type: String,
    required: true,
    default: true
  },
  friends: {
    type: [{
      type: Schema.Types.ObjectId,
      ref: 'peopleModel'
    }],
    validate: [arrayLimit, '{PATH} exceeds the limit of 10']
  }
});

function arrayLimit(val) {
  return val.length <= 10;
}

回答by Saravana

starting from mongo 3.6 you can add validation for a collection at server end, each document inserted/updated will be validated against the validator $jsonSchema, only the valid gets inserted, validation error will be for invalid documents

从 mongo 3.6 开始,您可以在服务器端为集合添加验证,插入/更新的每个文档都将根据验证器$jsonSchema进行验证,只有有效的被插入,验证错误将针对无效的文档

db.createCollection("people", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: [ "name" ],
         properties: {
            name: {
               bsonType: ["string"],
               description: "must be a string"
            },
            friends: {
               bsonType: ["array"],
               items : { bsonType: ["string"] },
               minItems: 0,
               maxItems: 10,
               description: "must be a array of string and max is 10"
            }
         }
      }
   }
});

collection

收藏

> db.people.find()

valid document

有效证件

> db.people.insert({name: 'abc' , friends : ['1','2','3','4','5','6','7','8','9','10']})
WriteResult({ "nInserted" : 1 })

invalid document

无效文件

> db.people.insert({name: 'def' , friends : ['1','2','3','4','5','6','7','8','9','10', '11']})
WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 121,
        "errmsg" : "Document failed validation"
    }
})

find

> db.people.find()
{ "_id" : ObjectId("5a9779b60546616d5377ec1c"), "name" : "abc", "friends" : [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" ] }
> 

回答by Luis

You can use $slice modifier at the time you push new friend id into your array https://docs.mongodb.com/manual/reference/operator/update/slice/#up._S_slice

您可以在将新朋友 ID 推入数组时使用 $slice 修饰符 https://docs.mongodb.com/manual/reference/operator/update/slice/#up._S_slice

$push: {
  friends: {
   $each: [id],
   $slice: -10
  }
}

回答by Ankit Kumar Rajpoot

This is my schema and array limit on assignedToId via an external function.

这是我通过外部函数对assignedToId 的架构和数组限制。

const mongoose = require("mongoose");
    const Schema = mongoose.Schema;

const taskSchema = new Schema({
  parentTask: {
    trim: true,
    type: Schema.Types.ObjectId,
    ref: "task",
  },
  assignedToId: [{
    trim: true,
    type: Schema.Types.ObjectId,
    ref: "Employees",
  }],
  createdBy: {
    trim: true,
    type: Schema.Types.ObjectId,
    ref: "Employees",
    required: [true, "User ID is required"]
  },
  createdByName: {
    trim: true,
    type: String,
    required: [true, "Creater name is required"]
  },
},
  {
    timestamps: true
  });

// Validations for assignedTo employees' size
taskSchema.path('assignedToId').validate(function (value) {
  console.log(value.length)
  if (value.length > 10) {
    throw new Error("Assigned person's size can't be greater than 10!");
  }
});

const Tasks = mongoose.model("Tasks", taskSchema);

module.exports = Tasks;