Mongoose中唯一数组值

13

目前正在为我的一个项目试用 Mongoose 和 MongoDB,但遇到了一个 API 不清楚的段落。

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

以下是一些示例代码:

var MyObject = new Mongoose.Schema({
    //....
    watching : {type: Array, required: false},
    //....
});
所以我的问题是如何确保推入数组的值仅存储一个,使值唯一,我可以只使用unique: true吗?
谢谢
4个回答

15
据我所知,mongoose 中唯一的方法是调用底层的 Mongo 操作符(由 danmactough 提到)。在 mongoose 中,它看起来像这样:

var idToUpdate, theIdToAdd; /* set elsewhere */
Model.update({ _id: idToUpdate }, 
             { $addToSet: { theModelsArray: theIdToAdd } }, 
             function(err) { /*...*/ }
);

注意:此功能需要 mongoose 版本>=2.2.2

3
theIdToAdd可以是一个数组,例如["ID1", "ID2"]吗? - RobertPitt
2
我猜你可以用 $each 来实现。 - Ustaman Sangat
2
@RoberPitt 很好的观点... theIdToAdd 不能是一个数组。如果你这样做,要插入的项将会是那个数组。我正在尝试找到解决方法 :-( - superiggy
如果theIdToAdd是数组,请使用$each。 - Maksim Nesterenko

7

所以,$addToSet将在数组中添加一个新元素,如果它还没有包含重复项。是否有一种方法(例如创建唯一索引),可以确保数组中从不重复?基本上,我想要一个Set而不是Sequence。 - Ustaman Sangat

1

Mongoose是mongodb的对象模型,因此一种选择是将文档视为普通的JavaScript对象。

MyModel.exec(function (err, model) {
   if(model.watching.indexOf(watchId) !== -1) model.watching.push(watchId);

   model.save(...callback);
});

虽然我同意mongoose应该内置一些支持这个功能的验证器(集合文档引用特性),尤其是因为大多数情况下你只想添加唯一引用。


2
如果集合是通过并发操作添加到模型中的,则此方法将无法正常工作。在您的示例中,您将检查集合是否存在于模型的旧副本中。因此需要强制执行数据库级别的唯一索引。 - ninja123

0

这就是使用Mongoose的方法,

如果你要传递一个数组作为参数

Model
    .findOneAndUpdate({ _id: yourID }, 
    { $addToSet: { watching: { $each: yourWatchingArr } } },
    function(err) { /*...*/ }
    );

如果你即将要处理的值是一个字符串。
Model
    .findOneAndUpdate({ _id: yourID }, 
    { $addToSet: { watching: yourStringValue } },
    function(err) { /*...*/ }
    );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接