Spring MongoDB标准更新
来源:爱站网时间:2021-09-27编辑:网友分享
如何编写查询以更新“ contacts.collection.value._class = SubClass2”并使用Spring Mongodb Criteria将值设置为xyz? {“ _class”:“ MyClass”,“ _id”:ObjectId(“ ...
问题描述
如何编写查询以更新“ 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:在...上找不到属性值!
注意:
- “联系人”集合是某些界面的列表。
- 我清除了变量名和类名。
- 如果您不知道如何使用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位,这是您的完整查询:
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);
上一篇:Java仅通过一个对象发送类参数