保存唯一数组元素 MongoDB

Posted

技术标签:

【中文标题】保存唯一数组元素 MongoDB【英文标题】:Saving unique array elements 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 将有助于唯一性,但对我的问题没有帮助。

【问题讨论】:

您能否举例说明您正在尝试防止的重复记录类型,但它是允许的? 【参考方案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
    
);

【讨论】:

以上是关于保存唯一数组元素 MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

验证元素的唯一性(二重循环法和快排优化)

CGBTN2107-DAY05总结复习

MongoDBMongodb——GridFS存储

mongodb介绍mongodb安装连接mongodbmongodb用户管理

最小唯一数组总和

如何从 C# 数组中返回唯一元素