2016-05-15 10 views
0

MongoDBを使用して一意の配列のString要素を保存しようとしていますが、何らかの理由で重複を保存することができます。ユニークな配列要素を保存するMongoDB

私はマングースを使用しています。私のコード:

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

は、基本的にはポイントは、ユーザーが電子メールを送っていたし、それらをスパムからユーザーを防ぐために、電子メールアドレスのリストを維持することです。しかし、このスキーマでは、いずれの文字列もsharedTo配列に、.save()には重複が存在するかどうかにかかわらずプッシュできます。これを防ぐ方法を教えてください。

EDIT: Laharの答えは私の質問に役立ちますが、entierlyではありません。 に少なくとも1つが重複している場合、ユーザーが電子メールを追加しないようにしたいと考えています。ですから、基本的に$ addToSetは一意性に役立ちますが、私の質問では役に立ちません。

+0

あなたはそれができているあなたが防ぐためにしようとしている重複レコードの種類の例を与えることはできますか? –

答えて

0

私は解決策を自分で見つけたように見えますが、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 
        } 
    }); 
    
  • 0

    あなたは$ addToSetを使用する代わりに、$の「sharedTo」アレイに電子メールを追加するためにプッシュすることができます

    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); 
        } 
    }); 
    }; 
    
    1

    入力されたすべての電子メールのためにこれを行うには、スキーマのクラスから実行されます独自の静的関数を実装することができます。 これで重複要素は追加されません(あなたのケースでは電子メール)。

    unique:true to whole arrayフィールドを指定することで、配列要素の一意性をチェックしません。

    $addToSetのドキュメントを確認してください。

    +0

    これは私が必要とするほとんどの答えです。問題は、重複があり、409の競合を返す場合にエラーをスローしたいということです。それも可能ですか? – Rouz

    +0

    その更新を実行すると、count nMatched、nUpserted、nModifiedのwriteResultオブジェクトが返されます。 nModifiedは、修正される文書の数を教えてくれます。 –

    +0

    はい、オブジェクトをデータベースに保存するので、技術的には、変更した長さが入力の長さよりも小さい場合、以前のバージョンにロールバックする必要がありますか?それは汚い間違った解決のように聞こえる、そうではありませんか? – Rouz

    関連する問題