2011-12-06 20 views
1

原子操作で投稿のコメント投票を増やそうとしているので、現在のユーザー名がDownVotersとUpVotersのcomment.Butのリストに存在しない場合は、upv​​oteのコメントにしようとしています。常にそうとは限りません。私はユーザー名がDownVotersとUpVotersのリストに存在しないことを確認しましたが、依然としてクエリの下は動作しません。下のクエリで何が間違っていますか?MongoDB増分クエリが期待通りに機能しない

var query = Query.And(Query.EQ("Comments._id", commentId), Query.NotIn("Comments.DownVoters", username)); 
var update = Update.Push("Commments.$.UpVoters",username).Inc("Commments.$.Score", 1); 
collection.Update(query, update); 

答えて

1

コードは正常です。何度も書きましたが、期待どおりに動作します。任意のフィールド名で単純な人間の間違いになることがあります(Commments - > Commentsのように)。

正確な問題を理解するには、mongodb shellでプレイすることをおすすめします。

すべての挿入テスト文書の最初の:

{ 
    "Comments": [ 
    { 
     "DownVoters": [], 
     "Score": 2, 
     "UpVoters": [], 
     "_id": 1 
    }, 
    { 
     "_id": 2, 
     "Score": 2, 
     "UpVoters": [], 
     "DownVoters": [] 
    } 
    ], 
    "_id": 1 
} 

また、私はネイティブのMongoDB構文にあなたのC#のクエリを翻訳してきたので、あなたは、MongoDBのシェルupdateでそれを使用することができます。

あなたのクエリ:

{"Comments._id": 1, "Comments.DownVoters" : { "$nin" : ["andrew"]}, 
        "Comments.UpVoters" : { "$nin" : ["andrew"]} } 

あなたの更新:

{"$push" : { "Comments.$.UpVoters": "andrew" }, 
"$inc" : {"Comments.$.Score": 1} } 

はそれを試してみて、問題が何であったかの答えとの私達に戻ってきます。

+0

実際、元のコードではスペルミスが発生していますが、サンプルコードには誤りがあります。あなたはそれが正しい質問であると確信していますか?私はこれを1つのQuery.ElemMatch( "Comments"、Query.And( "_ id"、commentId)、Query.NotIn( "DownVoters"、username))に置き換えて動作させていますが、クエリを実行しても予期しない結果が発生する – AnyOne

+0

@AnyOne:うん、それは私のmongodb 2.0での作業。 –

+0

シンプルなシナリオでテストすると、私はあなたに書きます。 – AnyOne

関連する問題