Mongodb位置操作员仅第一个匹配的解决方法

Mongodb位置操作员仅第一个匹配的解决方法,mongodb,morphia,Mongodb,Morphia,我有一个带有通知列表的用户对象 { "notifications": { "0": { "id": "1", "isRead": false, "user": { "id": ObjectId("4f7999c5e4b0f2e6b8490e08"), "firstName": "X", "lastName": "Y", "profilePictureUrl": "URL1" } }, "1": { "id": "2",

我有一个带有通知列表的用户对象

{
 "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" 
     } 
    } 
  },
}
当用户更改其配置文件pic时,我希望更新所有相应的通知。我试图在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);
Query Query=ds.createQuery(UserEntity.class).filter(“notifications.user.id”,
字段(“notifications.user.profilePictureUrl”).notEqual(userProperties.profilePictureUrl);
UpdateOperations op=ds.createUpdateOperations(UserEntity.class).disableValidation()
.set(“通知.$.user.profilePictureUrl”,userProperties.profilePictureUrl);
结果=更新(查询,op);

有什么解决办法吗?我将在后台工作中执行此操作,这样成本更高的解决方案也会起作用。

您应该为更新设置multi=True。请参见,您应该为更新设置multi=True。请参见

问题在于使用$operator。当前,$运算符仅应用于查询中的第一个匹配项。


您应该更新整个列表(获取、修改和保存)。

问题在于使用$operator。当前,$运算符仅应用于查询中的第一个匹配项。


您应该更新整个列表(获取、修改和保存)。

我认为您可以将位置运算符与$elemMatch运算符结合使用,以匹配子数组中的多个字段和多个文档


从MongoDB bug报告中找到一个类似的案例。

我认为您可以将位置运算符与$elemMatch运算符结合起来,以匹配子数组中的多个字段和多个文档


来自MongoDB bug报告中的一个类似案例。

我使用的是morphia,其中update命令导致multi=true。我使用的是morphia,其中update命令导致multi=true。糟糕,似乎就是这样。morphia返回[UpdateResults](),它有一个getUpdatedCount()方法。即使我在循环中运行此查询,直到getUpdatedCount为0,它也不会运行—看起来mongodb正在缓存上一个操作!另一个选项是查看数据模型。您可以使用映射来代替列表:user id->{first_name:…,last_name…}哎呀,似乎就是这样。morphia返回[UpdateResults](),它有一个getUpdatedCount()方法。即使我在循环中运行此查询,直到getUpdatedCount为0,它也不会运行—看起来mongodb正在缓存上一个操作!另一个选项是查看数据模型。您可以使用映射而不是列表:用户id->{first_name:…,last_name…}