目前正在追踪Mongoose和MongoDB的一个项目,但遇到了一个API不明确的部分。
我有一个包含多个键和文档的模型,其中一个键称为watchList
。这是用户正在观看的ID数组,但我需要确保这些值保持唯一。
以下是一些示例代码:
var MyObject = new Mongoose.Schema({
//....
watching : {type: Array, required: false},
//....
});
所以我的问题是如何确保推送到数组中的值只存储一个,因此使值唯一,我可以使用unique: true
吗?
由于
答案 0 :(得分:14)
据我所知,在mongoose中执行此操作的唯一方法是调用底层的Mongo运算符(mentioned by danmactough)。在猫鼬中,看起来像是:
var idToUpdate, theIdToAdd; /* set elsewhere */
Model.update({ _id: idToUpdate },
{ $addToSet: { theModelsArray: theIdToAdd } },
function(err) { /*...*/ }
);
注意:此功能需要mongoose版本> = 2.2.2
答案 1 :(得分:6)
答案 2 :(得分:1)
Mongoose是mongodb的对象模型,因此一个选项是将文档视为普通的javascript对象。
MyModel.exec(function (err, model) {
if(model.watching.indexOf(watchId) !== -1) model.watching.push(watchId);
model.save(...callback);
});
虽然,我同意mongoose应该对collection document reference feature的验证器形式构建一些支持 - 特别是因为大多数时候你只想添加唯一引用。
答案 3 :(得分:0)
如果您即将获得的价值是一个数组
Model
.findOneAndUpdate({ _id: yourID },
{ $addToSet: { watching: { $each: yourWatchingArr } } },
function(err) { /*...*/ }
);
如果您即将得到的值是一个字符串
Model
.findOneAndUpdate({ _id: yourID },
{ $addToSet: { watching: yourStringValue } },
function(err) { /*...*/ }
);