2012-04-05 9 views
0

ユーザーは、私はすべて対応する通知を更新したい彼のプロフィール写真を変更すると、私は通知MongoDBの位置演算子のみ最初に一致したの回避策

{ 
"notifications": { 
"0": { 
    "id": "1", 
    "isRead": false, 
    "user": { 
    "id": ObjectId("4f7999c5e4b0f2e6b8490e08"), 
    "firstName": "X", 
    "lastName": "Y", 
    "profilePictureUrl": "URL1" 
    } 
}, 
"1": { 
    "id": "2", 
    "user": { 
    "id": ObjectId("4f7999c5e4b0f2e6b8490e08"), 
    "firstName": "X", 
    "lastName": "Y", 
    "profilePictureUrl": "URL1" 
    } 
    } 
    }, 
} 

のリストをユーザオブジェクトを持っています。私はこのようなモルフィアで何かをしようとしているが、それは最初のエントリだけを更新するようだ。

Query<UserEntity> query = ds.createQuery(UserEntity.class).filter("notifications.user.id", 
       userProperties.id).field("notifications.user.profilePictureUrl").notEqual(userProperties.profilePictureUrl); 
     UpdateOperations<UserEntity> op = ds.createUpdateOperations(UserEntity.class).disableValidation() 
       .set("notifications.$.user.profilePictureUrl", userProperties.profilePictureUrl); 
     results = update(query, op); 

これに対応する回避策はありますか?バックグラウンドでこれをやっていきますので、コストのかかるソリューションもうまくいきます。

答えて

3

問題は$演算子を使用していることです。現在、$演算子はクエリの最初に一致した項目にのみ適用されます。 http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

リスト全体を更新(フェッチ、変更、保存)する必要があります。

+0

ヤック、そうであるようです。 morphiaは[UpdateResults]を返します(http://code.google.com/p/morphia/source/browse/trunk/morphia/src/main/java/com/google/code/morphia/query/UpdateResults.java?r= 1796)メソッドgetUpdatedCount()を持っています。 getUpdatedCountが0になるまでループ内でこのクエリを実行しても、mongodbが前の操作をキャッシュしているようです。 –

+0

もう1つの方法は、データモデルを確認することです。リストの代わりにマッピングを使うことができます:user id - > {first_name:...、last_name ...} –

0

$ elemMatch演算子と位置演算子を組み合わせて、サブ配列内の複数のフィールドと複数のドキュメントを一致させることができると思います。

Check this example MongoDBバグレポートからも同様です。

関連する問題