2013-07-22 44 views
0

如何編寫查詢來更新「contacts.collection.value._class = SubClass2」,並使用Spring Mongodb Criteria將值設置爲xyz?Spring MongoDB標準更新

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

我試圖用Spring Data 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. 如果你不知道如何使用Criteria做到這一點,請給我java代碼。

感謝

添加堆棧跟蹤

這裏是堆棧跟蹤

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