0

「contacts.collection.value._class = SubClass2」を更新するクエリを作成し、Spring Mongodb Criteria で値を xyz に設定するにはどうすればよいですか?

{ "_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 でそれを実行しようとすると、何も更新されません。

4

2 に答える 2

3

query は、クエリ基準に一致するコレクション配列のインデックスを取得します。データ構造では、連絡先用とコレクション用の 2 つの配列インデックスが必要ですが、これは不可能です (私の知る限り)。連絡先配列アイテムまたはコレクション配列アイテムの位置を知る必要があります。連絡先配列項目の位置を知っていると仮定しましょう。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);
于 2013-07-23T18:00:41.270 に答える