【问题标题】:Unique array values in MongooseMongoose 中的唯一数组值
【发布时间】:2012-03-27 06:26:36
【问题描述】:

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

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

这里是一些示例代码:

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

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

谢谢

【问题讨论】:

    标签: arrays unique mongoose


    【解决方案1】:

    【讨论】:

    • 因此,如果 $addToSet 已经不包含重复元素,它会将新元素添加到数组中。有没有办法(例如创建唯一索引),可以确保数组中永远不会重复?基本上,我想要一个 Set 而不是一个 Sequence。
    【解决方案2】:

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

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

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

    【讨论】:

    • 可以theIdToAdd为数组,如["ID1", "ID2"]?
    • 我想你可以用 $each 来做。
    • @RoberPitt 好点... theIdToAdd 不能是数组。如果这样做,要插入的项目将是该数组。我正在尝试找到解决此问题的方法:-(
    【解决方案3】:

    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 的验证器的形式对此提供一些支持——尤其是因为大多数时候您只想添加唯一的引用。

    【讨论】:

    • 如果集合是通过并发操作添加到模型中的,这将不起作用,在您的示例中,您将检查集合是否存在于模型的陈旧副本中。因此需要一个强制的数据库级唯一索引。
    【解决方案4】:

    这就是使用 Mongoose 的方法,

    如果你即将到来的值是一个数组

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-02
      • 2019-08-05
      • 2012-08-27
      • 1970-01-01
      • 2015-09-07
      • 2016-03-13
      • 2017-01-31
      相关资源
      最近更新 更多