保存唯一数组元素 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的主要内容,如果未能解决你的问题,请参考以下文章