【问题标题】:Saving unique array elements MongoDB保存唯一数组元素 MongoDB
【发布时间】:2016-09-11 15:22:45
【问题描述】:

我正在尝试使用 MongoDB 保存一个唯一的 String 元素数组,但由于某种原因,它允许我保存重复项。

我正在使用猫鼬。我的代码:

 schema = mongoose.Schema({
    "searchingId": { "type":  String,
        "unique": true,
        "index": true },
    "sharedTo" : {
        type: [String],
        unique: true,
        "trim":true
    }
}, {collection: 'myCollection'});

基本上,重点是保留用户发送电子邮件的电子邮件地址列表,并防止用户发送垃圾邮件。但是这个模式将允许我将任何字符串推送到 sharedTo 数组和 .save() 它,无论是否存在重复项。如何防止这种情况发生?

编辑: 拉哈尔的回答确实对我的问题有所帮助,但并不完全。如果有至少一个重复,我想阻止用户添加电子邮件。所以基本上 $addToSet 将有助于唯一性,但对我的问题没有帮助。

【问题讨论】:

  • 您能否举例说明您正在尝试防止的重复记录类型,但它是允许的?

标签: node.js mongodb mongoose


【解决方案1】:

您可以使用 $addToSet 而不是 $push 在“sharedTo”数组中添加电子邮件。 那不会添加重复的元素(在您的情况下是电子邮件)。

通过为整个数组字段提供 unique:true 不会检查数组元素的唯一性。

请查看$addToSet 文档。

【讨论】:

  • 这几乎就是我需要的答案。问题是如果有重复我想抛出一个错误并返回 409 冲突。这甚至可能吗?
  • 因此,当您运行该更新时,它会返回具有 nMatched、nUpserted、nModified 计数的 writeResult 对象。 nModified 会告诉你有多少文档被修改了。
  • 是的,但它会将对象保存到数据库中,所以从技术上讲,如果修改小于输入长度,我将不得不回滚到以前的版本?这听起来像是肮脏和错误的解决方案,不是吗?
  • 能否提供需要验证的代码sn-p?这样可以更好地了解您真正想要的位置和方式。
【解决方案2】:

您可以实现自己的静态函数,该函数将从模式类运行,为输入的每封电子邮件执行此操作

UserSchema.statics.findUseremail = function(useremail, suffix,
callback) {

var _this = this;
var possibleuseremail = useremail + (suffix || '');
_this.findOne({
    useremail: possibleuseremail
    }, function(err, userem) {
    if (!err) {
        if (!userem) {
            callback(findUseremail);
        } else {
        return _this.findUseremail(useremail, (suffix || 0) +
        1, callback);
        }
    } else {
    callback(null);
    }
});
};

【讨论】:

    【解决方案3】:

    看来我自己找到了解决方案,但感谢 Lahar Shah 的回答为我指明了正确的方向。而不是使用

    Model.update(conditions, doc, [options], [callback])
    

    我做到了

    • 获取对象
    • 在检查重复邮件时将每封电子邮件添加到我的 sharedTo 属性中。
    • 如果没有重复则保存对象

    代码:

    var  length = emails.length;
    for( var i = 0; i < length; i++ ) {
        var saved = doc.sharedTo.addToSet(emails[i]).length;
        if (saved != 1) {
            //status 409 - You have already sent email to user emails[i]
            return;
        }
    }
    
    doc[0].save(function(fail, success) {
        if(fail) {
            //error
        } else {
            //success return 200
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2019-06-26
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多