Mongo 架构,具有唯一值的字符串数组
Mongo schema, array of string with unique values
我正在为 mongo 文档创建架构,除了防止在非对象数组中出现重复,我可以做任何事情。
我知道 addToSet,但我指的是 Mongo 架构。
我不想使用 $addToSet 检查更新,而是希望它成为我的模式验证的一部分。
示例如下。
let sampleSchema = {
name: { type: 'String', unique: true },
tags: [{ type: 'String', unique: true }]
}
以上代码段防止名称具有重复值。它允许将标签存储为字符串数组。
但是..我不能将数组限制为唯一字符串。
{ name: 'fail scenario', tags: ['bad', 'bad', 'array']}
我可以插入这条记录,这应该是一个失败的场景。
const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');
const _ = require('underscore');
let sampleSchema = new mongoose.Schema({
name: {
type: 'String',
unique: true
},
tags: [{
type: 'String'
}]
})
sampleSchema.pre('save', function (next) {
this.tags = _.uniq(this.tags);
next();
});
const Sample = mongoose.model('sample', sampleSchema, 'samples');
router.post('/sample', function (req, res, next) {
const sample = new Sample(req.body);
sample.save()
.then((sample) => {
return res.send(sample);
})
.catch(err => {
return res.status(500).send(err.message);
})
});
我得出的结论是,通过 Mongoose Schema 无法做到这一点。
JSON 架构是这样完成的。
let schema = {
name: { type: 'string' }
tags: {
type: 'array',
items: { type: 'string', uniqueItems: true }
}
}
我将在创建 Mongo 文档之前使用 JSON 模式进行验证。
此方法建立在 Med 的答案之上,处理引用,并完全在方案验证中完成。
let sampleSchema = new mongoose.Schema({
strings: [{type: 'String'}],
references: [{type: mongoose.Schema.Types.ObjectId, ref: 'Reference'],
});
sampleSchema.pre('save', function (next) {
let sample = this;
sample.strings = _.uniq(sample.strings, function(i) {return (i._id) ? i._id.toString() : i;});
sample.references = _.uniq(sample.references, function(i) {return (i._id) ? i._id.toString() : i;});
return next();
});
我正在为 mongo 文档创建架构,除了防止在非对象数组中出现重复,我可以做任何事情。
我知道 addToSet,但我指的是 Mongo 架构。
我不想使用 $addToSet 检查更新,而是希望它成为我的模式验证的一部分。
示例如下。
let sampleSchema = {
name: { type: 'String', unique: true },
tags: [{ type: 'String', unique: true }]
}
以上代码段防止名称具有重复值。它允许将标签存储为字符串数组。
但是..我不能将数组限制为唯一字符串。
{ name: 'fail scenario', tags: ['bad', 'bad', 'array']}
我可以插入这条记录,这应该是一个失败的场景。
const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');
const _ = require('underscore');
let sampleSchema = new mongoose.Schema({
name: {
type: 'String',
unique: true
},
tags: [{
type: 'String'
}]
})
sampleSchema.pre('save', function (next) {
this.tags = _.uniq(this.tags);
next();
});
const Sample = mongoose.model('sample', sampleSchema, 'samples');
router.post('/sample', function (req, res, next) {
const sample = new Sample(req.body);
sample.save()
.then((sample) => {
return res.send(sample);
})
.catch(err => {
return res.status(500).send(err.message);
})
});
我得出的结论是,通过 Mongoose Schema 无法做到这一点。
JSON 架构是这样完成的。
let schema = {
name: { type: 'string' }
tags: {
type: 'array',
items: { type: 'string', uniqueItems: true }
}
}
我将在创建 Mongo 文档之前使用 JSON 模式进行验证。
此方法建立在 Med 的答案之上,处理引用,并完全在方案验证中完成。
let sampleSchema = new mongoose.Schema({
strings: [{type: 'String'}],
references: [{type: mongoose.Schema.Types.ObjectId, ref: 'Reference'],
});
sampleSchema.pre('save', function (next) {
let sample = this;
sample.strings = _.uniq(sample.strings, function(i) {return (i._id) ? i._id.toString() : i;});
sample.references = _.uniq(sample.references, function(i) {return (i._id) ? i._id.toString() : i;});
return next();
});