2017-01-22 39 views
0

我正在爲mongo文檔創建架構,除了防止非對象數組中的重複項之外,我可以執行所有操作。Mongo架構,具有唯一值的字符串數組

我知道addToSet,但我指的是Mongo Schema。

我不想檢查更新使用$ addToSet,而是我希望這是我的架構驗證的一部分。

下面的示例。

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

上面的代碼片段可防止名稱具有重複值。它允許標籤以字符串數組的形式存儲。

但是..我不能限制數組是唯一的字符串。

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

我可以插入這條應該是失敗場景的記錄。

+0

[在對象的嵌套數組貓鼬唯一值]的可能的複製(http://stackoverflow.com/questions/15921700/mongoose-unique-values-in-nested-array-of-objects) – Karlen

+0

我知道$ 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

感謝您的答案,但我試圖做只有架構,而不是代碼和保存標誌,更新方法貓鼬。 – Proximo

+0

在下劃線中,它是_.uniq而不是_.unique。此外,這裏是一個修改後的版本,與參考一起使用: 'this.tags = _.uniq(this.tags,function(i){return(i._id)?i._id.toString():i;} );' – BuffMcBigHuge

-1

我得出的結論是,這是不可能通過Mongoose Schema來完成的。

JSON模式是這樣完成的。

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

我將在創建Mongo文檔之前使用JSON模式進行驗證。

0

此方法建立在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(); 

}); 
相關問題