Mongoose 中的唯一数组值

Unique array values in Mongoose

提问人:RobertPitt 提问时间:3/10/2012 更新时间:1/25/2020 访问量:14196

问:

目前,我的一个项目落后于 Mongoose 和 MongoDB,但遇到了一个 API 不清楚的细分市场。

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

下面是一些示例代码:

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

所以我的问题是,我怎样才能确保推送到数组中的值只存储一个,所以使值唯一,我可以只使用吗?unique: true

谢谢

数组 唯一的 猫鼬

评论


答:

7赞 danmactough 3/10/2012 #1

查看有关 $addToSet 运算符的 Mongo 文档

评论

0赞 Ustaman Sangat 3/16/2012
因此,如果数组中已经不包含重复项,$addToSet 将向数组中添加一个新元素。有没有办法(例如创建一个唯一的索引),以确保数组中永远不会重复?基本上,我想要一个 Set 而不是一个 Sequence。
15赞 frank hadder 3/12/2012 #2

据我所知,在 mongoose 中执行此操作的唯一方法是调用底层 Mongo 运算符(由 danmactough 提及)。在猫鼬中,它看起来像:

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

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

评论

3赞 RobertPitt 3/15/2012
IdToAdd 可以是一个数组吗,例如?["ID1", "ID2"]
2赞 Ustaman Sangat 3/16/2012
我想你可以用$each来做到这一点。
2赞 superiggy 2/16/2013
@RoberPitt点好...theIdToAdd 不能是数组。如果这样做,则要插入的项将是该数组。我正在努力找到解决这个问题的方法:-(
0赞 Maksim Nesterenko 8/24/2017
如果 IdToAdd 是数组,请使用 $each docs.mongodb.com/manual/reference/operator/update/addToSet/...
1赞 TaylorMac 3/10/2014 #3

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

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

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

虽然,我确实同意猫鼬应该以验证器的形式为收集文档引用功能提供一些支持——特别是因为大多数时候你只想添加唯一的引用。

评论

2赞 ninja123 4/2/2014
如果集合是通过并发操作添加到模型中的,则此操作将不起作用,并且在示例中,您将检查该集合是否存在于模型的过时副本中。因此,需要强制执行的数据库级别唯一索引。
0赞 Hammad Tariq 1/25/2020 #4

这就是你如何使用猫鼬来做到这一点,

如果即将到来的值是 Array

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

如果即将到来的值是字符串

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