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 回答