Estoy creando el esquema para un documento mongo y puedo hacer todo excepto evitar duplicados en una matriz que no sea de objetos.
Conozco addToSet, pero me refiero a Mongo Schema.
No quiero verificar la Actualización usando $addToSet, sino que quiero que esto sea parte de la validación de mi esquema.
Ejemplo a continuación.
let sampleSchema = { name: { type: 'String', unique: true }, tags: [{ type: 'String', unique: true }] }El fragmento anterior evita que el nombre tenga valores duplicados. Permite que las etiquetas se almacenen como una matriz de cadenas.
Pero... no puedo limitar la matriz para que sean cadenas únicas.
{ name: 'fail scenario', tags: ['bad', 'bad', 'array']}Puedo insertar este registro que debería ser un escenario fallido.
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); }) });Llegué a la conclusión de que esto es imposible de hacer a través de Mongoose Schema.
El esquema JSON se hace así.
let schema = { name: { type: 'string' } tags: { type: 'array', items: { type: 'string', uniqueItems: true } } }Validaré con el esquema JSON antes de crear el documento Mongo.
Este método se basa en la respuesta de Med, maneja las referencias y se realiza completamente en la validación del esquema.
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(); });