2013-07-22 3 views
0

Как написать запрос для обновления «contacts.collection.value._class = SubClass2» и установить значение xyz с критериями Spring Mongodb?Spring MongoDB Criteria update

{ "_class" : "MyClass", 
    "_id" : ObjectId("51ecc95503644e4489bb742e"), 
    "contacts" : [ 
    { "property1" : "Value1", 
     "property2" : "Value2", 
     "collection" : [ 
     { "value" : "1", 
      "_class" : "SubClass1" }, 
     { "value" : "2", 
      "_class" : "SubClass2" }, 
     { "value" : "2", 
      "_class" : "SubClass3" }, 

Я пытаюсь сделать это с помощью класса данных Spring Mongo Criteria.

До сих пор я получил это, но это не работает

  query = new Query(Criteria.where("_id").is(myClassId) 
        .and("contacts.collection.value").is("2") 
        .and("contacts.collection._class").is("SubClass2")); 
      update.set("contacts.collection.$.value", "3"); 
      mongoTemplate.updateFirst(query, update, MyClass.class); 

Я получаю эту ошибку;

java.lang.IllegalArgumentException: Не найдено значения свойства ...!

Примечание:

  1. "Контакты" коллекция представляет собой список некоторого интерфейса.
  2. Я дезинфицировал имена переменных и имена классов.
  3. Если вы не знаете, как это сделать с критериями, пожалуйста, дайте мне код java.

Благодаря

Добавление StackTrace

Вот трассировки стека

java.lang.IllegalArgumentException: No property xyz found on com.blah.SomeInterface! 
     at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:225) ~[spring-data-commons-1.5.1.RELEASE.jar:na] 
     at org.springframework.data.mongodb.core.convert.QueryMapper.getPath(QueryMapper.java:202) ~[spring-data-mongodb-1.2.1.RELEASE.jar:na] 
     at org.springframework.data.mongodb.core.convert.QueryMapper.getTargetProperty(QueryMapper.java:190) ~[spring-data-mongodb-1.2.1.RELEASE.jar:na] 
     at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedObject(QueryMapper.java:86) ~[spring-data-mongodb-1.2.1.RELEASE.jar:na] 
     at org.springframework.data.mongodb.core.MongoTemplate$11.doInCollection(MongoTemplate.java:925) ~[spring-data-mongodb-1.2.1.RELEASE.jar:na] 
     at org.springframework.data.mongodb.core.MongoTemplate$11.doInCollection(MongoTemplate.java:920) ~[spring-data-mongodb-1.2.1.RELEASE.jar:na] 
     at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:388) ~[spring-data-mongodb-1.2.1.RELEASE.jar:na] 
     at org.springframework.data.mongodb.core.MongoTemplate.doUpdate(MongoTemplate.java:920) ~[spring-data-mongodb-1.2.1.RELEASE.jar:na] 
     at org.springframework.data.mongodb.core.MongoTemplate.updateFirst(MongoTemplate.java:902) ~[spring-data-mongodb-1.2.1.RELEASE.jar:na] 

На основании ответа Jayz, я написал обновление с RoboMongo и он работает обновляет результат запроса!

db.myDB.update(
{ 
"_id":ObjectId("51ecc95503644e4489bb742e"), 
"contacts.collection._class": "SubClass1", 
"contacts.collection.value": "1", 
}, 
{ 
    $set: { 'contacts.0.collection.$.value': '3' } 
}, 
{ getLastError: 1 }); 

Но когда я пытаюсь сделать это с помощью mongoTemplate, ничего не обновляется.

+0

Не могли бы вы разместить весь стек? – udalmik

+1

След стека добавлен. – aug70co

ответ

3

запрос предоставит вам индекс массива коллекции, который соответствует критериям запроса. С вашей структурой данных вам нужны два индекса массива: один для контактов и один для коллекции, что невозможно (насколько мне известно). Вам нужно знать позицию элемента массива контактов или элемента массива коллекции. Предположим, вы знаете позицию элемента массива контактов. если это 0-я позиция, вот ваш полный запрос:

query = new Query(new Criteria().andOperator(
     Criteria.where("_id").is(myClassId), 
     Criteria.where("contacts.collection.value").is("2"), 
     Criteria.where("contacts.collection._class").is("SubClass2")); 
     update.set("contacts.0.collection.$.value", "3"); 
     mongoTemplate.updateFirst(query, update, MyClass.class); 
+0

Спасибо @Jayz Это правильный запрос, но обновление не работает, контакты - это коллекция, а коллекция - это коллекция. Итак, как мне указать значение, которое находится внутри коллекции другой коллекции? Ниже не работает -.. Contacts.collection значение $ Также пытался -.. Contacts.0.collection $ значение Не работает либо – aug70co

+0

проверить мой отредактированный ответ – Jayz

+0

, к сожалению, ничего не обновляется. Я добавил WriteResult, чтобы увидеть результат getN() равен 0 и result.getLastError(). GetErrorMessage() имеет значение null. – aug70co