Mongoose中的唯一数组值

时间:2012-03-09 20:04:04

标签: arrays unique mongoose

目前正在追踪Mongoose和MongoDB的一个项目,但遇到了一个API不明确的部分。

我有一个包含多个键和文档的模型,其中一个键称为watchList。这是用户正在观看的ID数组,但我需要确保这些值保持唯一。

以下是一些示例代码:

var MyObject = new Mongoose.Schema({
    //....
    watching : {type: Array, required: false},
    //....
});

所以我的问题是如何确保推送到数组中的值只存储一个,因此使值唯一,我可以使用unique: true吗?

由于

4 个答案:

答案 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) { /*...*/ }
    );