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

查询将为您获取与查询条件匹配的集合数组的索引。使用您的数据结构,您需要两个数组索引,一个用于联系人,一个用于收集,这是不可能的(据我所知)。您需要知道联系人数组项或集合数组项的位置。假设您知道联系人数组项的位置。如果它是第 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 回答
0

过滤位置运算符 $ 标识与更新操作的 arrayFilters 条件匹配的数组元素。

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.$.collection.$.value", newValueToUpdate in perticular position); mongoTemplate.updateFirst(query, update, MyClass.class );

于 2020-02-25T07:05:47.460 回答