2012-04-05 4 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

Yuck, это похоже на случай. 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

Другой вариант - просмотреть вашу модель данных. Вы можете использовать сопоставление вместо списка: user id -> {first_name: ..., last_name ...} –

0

Я думаю, что вы можете комбинировать оператор позиционирования с оператором $ elemMatch для сопоставления нескольких полей и нескольких документов в подматрице.

Check this example с сообщением об ошибке MongoDB с аналогичным случаем.

Смежные вопросы