0

通知のリストを持つユーザー オブジェクトがあります

{
 "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" 
     } 
    } 
  },
}

ユーザーがプロフィールの写真を変更すると、対応するすべての通知を更新したいと考えています。morphiaでこんなことをしようとしているのですが、最初のエントリしか更新しないようです。

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

これに対する回避策はありますか? これはバックグラウンド ジョブで行うので、よりコストのかかるソリューションでも機能します。

4

3 に答える 3

3

問題は $ 演算子の使用にあります。現在、$ 演算子は、クエリで最初に一致したアイテムにのみ適用されます。 http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

リスト全体を更新する必要があります (取得、変更、保存)。

于 2012-04-05T07:56:04.170 に答える
0

更新には multi=True を設定する必要があります。http://www.mongodb.org/display/DOCS/Updating#Updating-update%28%29を参照してください。

于 2012-04-05T07:01:26.627 に答える
0

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

同様のケースの MongoDB バグ レポートからこの例を確認してください。

于 2012-08-30T05:54:37.617 に答える