2016-07-13 27 views
4

user.updateを使用した場合のみ、1回のdbコールでこの条件付き更新を行う方が良いでしょうか?MongoDbの条件付き更新

user.findOne({ fbPsid: sender }, 'referal', function (err, res) { 
    if (res.referal.length < 5) { 
     user.update(
      { fbPsid: sender }, 
      { 
       $set: { status: { state: -11 } }, 
       $push: { 
        "referal": { 
         name: '', 
         phonenumber: '', 
         email: '' 
        } 
       } 
      }, function (err, res){} 
     ); 
    } else { 
     sendTextMessage(sender, "You have already completed Your Five Referal!") 
    } 
}) 
+1

チェック 'findAndModify' https://docs.mongodb.com/manual/reference/method/db.collection.findAndModify/ –

答えて

1

を試すことができます)

user.findOneAndUpdate({fbPsid:sender,'referal.4':{$exists:false}}, 
    {$set:{status: {state: -11}},$push:{"referal":{name:'',phonenumber:'',email:''}}}, 
    {new:true}, 
    function(error, result) { 
     if(error) { 
     console.log(error) 
     } else { 
     console.log(result); 
     } 
}); 

referal.4:{ $ exists:false} ==>配列内のインデックス4をチェックします。レコードが見つかった場合は、配列の長さが5未満であることを意味します。

$を使用している場合の注意:ここで、$はJavaScriptを評価し、インデックスを利用できません。Refer $where operator

0

あなたはあなたが古いバージョンのためのMongoDB 3.2 + :(またはfindAndModifyで次のクエリを使用することができ、この1

user.findOneAndUpdate({fbPsid:sender, $where:'this.referal.length < 5'}, 
    {$set:{status: {state: -11}},$push:{"referal":{name:'',phonenumber:'',email:''}}}, 
    {new:true}, 
    function(error, updateDoc) { 
     if(error) { 
     // handle error 
     } else { 
     // success action 
     } 
}); 
+0

は良いアプローチのように見えますが、uはthis.referal場合、それが何を返す私に言うことができます.lengthは5に等しくなります。私はハンドルケースを書くことができますか?私はMongo Db – pulankit