2017-01-22 5 views
0

Я создаю схему для документа mongo, и я могу делать все, кроме предотвращения дубликатов в массиве без объектов.Mongo schema, массив строк с уникальными значениями

Я знаю о приложении addToSet, но я имею в виду Mongo Schema.

Я не хочу проверять обновление с помощью $ addToSet, скорее я хочу, чтобы это было частью моей проверки схемы.

Пример ниже.

let sampleSchema = { 
    name: { type: 'String', unique: true }, 
    tags: [{ type: 'String', unique: true }] 
} 

Вышеприведенный фрагмент предотвращает дублирование значений имен. Он позволяет хранить теги в виде массива строк.

Но .. Я не могу ограничить массив уникальными строками.

{ name: 'fail scenario', tags: ['bad', 'bad', 'array']} 

Я могу вставить эту запись, которая должна быть неудачным сценарием.

+0

Возможного дубликат [значения Mongoose уникальных в гнездовом массиве объектов] (http://stackoverflow.com/questions/15921700/mongoose-unique-values-in-nested-array-of-objects) – Karlen

+0

I Я знаю, что $ addToSet, но я имею в виду Mongo Schema. – Proximo

ответ

0
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 = _.unique(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); 
    }) 
}); 
+0

Спасибо за ответ, но я пытаюсь сделать это только с помощью схемы, а не кода, а не с помощью флажков для сохранения, методов обновления mongoose. – Proximo

+0

В подчеркивании это _.uniq не _.unique. Кроме того, здесь приведена пересмотренная версия, которая работает со ссылками: 'this.tags = _.uniq (this.tags, function (i) {return (i._id)? I._id.toString(): i;}); ' – BuffMcBigHuge

-1

Я пришел к выводу, что это невозможно сделать с помощью схемы Mongoose.

JSON схема делается так же.

let schema = { 
    name: { type: 'string' } 
    tags: { 
     type: 'array', 
     items: { type: 'string', uniqueItems: true } 
    } 
} 

Я буду проверять с помощью схемы JSON перед созданием Mongo Document.

0

Этот метод основан на ответе Меди, обрабатывает ссылки и полностью выполнен в рамках проверки схемы.

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(); 

}); 

 Смежные вопросы

  • Нет связанных вопросов^_^