【发布时间】:2020-06-27 07:41:50
【问题描述】:
存储在 mongodb 中的文档:
{
"CNF_SERVICE_ID":"1",
"SERVICE_CATEGORY":"COMMON_SERVICE",
"SERVICES":[{
"SERVICE_NAME":"Authentication Service",
"VERSIONS":[{
"VERSION_NAME":"AuthenticationServiceV6_3",
"VERSION_NUMBER":"2",
"VERSION_NOTES":"test",
"RELEASE_DATE":"21-02-2020",
"OBSOLETE_DATE":"21-02-2020",
"STATUS":"Y",
"GROUPS":[{
"GROUP_NAME":"TEST GROUP",
"CREATED_DATE":"",
"NODE_NAMES":[
""
],
"CUSTOMERS":[{
"CUSTOMER_CONFIG_ID":"4",
"ACTIVATION_DATE":"21-02-2020",
"DEACTIVATION_DATE":"21-02-2020",
"STATUS":"Y"
}]
}]
}]
}
]
}
现在,我需要将另一个客户 json 添加到上述同一文档中“GROUPS”内的数组“CUSTOMERS”中。客户 json 是这样的:
{
"CUSTOMER_CONFIG_ID":"10",
"ACTIVATION_DATE":"16-03-2020",
"DEACTIVATION_DATE":"16-03-2021",
"STATUS":"Y"
}
我试过这个:
Update update = new Update().push("SERVICES.$.VERSIONS.GROUPS.CUSTOMERS",customerdto);
mongoOperations.update(query, update, Myclass.class, "mycollection");
但是,我得到了异常:org.springframework.data.mongodb.UncategorizedMongoDbException: 命令失败,错误 28 (PathNotViable): 'Cannot create field 'GROUPS' in element
[编辑添加]
我能够使用过滤的位置运算符对其进行更新。以下是我使用的查询:
update(
{ "SERVICE_CATEGORY":"COMMON_SERVICE", "SERVICES.SERVICE_NAME":"Authentication Service", "SERVICES.VERSIONS.VERSION_NAME":"AuthenticationServiceV6_3"},
{ $push:{"SERVICES.$[].VERSIONS.$[].GROUPS.$[].CUSTOMERS": { "CUSTOMER_CONFIG_ID":"6", "ACTIVATION_DATE":"31-03-2020", "STATUS":"Y" } } }
);
实际上,此查询更新了所有字段,而与过滤条件无关。所以。我试过这个,但我面临语法异常。请帮忙。
update(
{"SERVICE_CATEGORY":"COMMON_SERVICE"},
{"SERVICES.SERVICE_NAME":"Authentication Service"},
{"SERVICES.VERSIONS.VERSION_NAME":"AuthenticationServiceV6_3"}
{
$push:{"SERVICES.$[service].VERSIONS.$[version].GROUPS.$[group].CUSTOMERS":{
"CUSTOMER_CONFIG_ID":"6",
"ACTIVATION_DATE":"31-03-2020",
"STATUS":"Y"
}
}
},
{
multi: true,
arrayFilters: [ { $and:[{ "version.VERSION_NAME": "AuthenticationServiceV6_3"},{"service.SERVICE_NAME":"Authentication Service"},{"group.GROUP_NAME":"TEST GROUP"}]} ]
}
);
更新:2020 年 4 月 1 日
我试过的代码:
validationquery.addCriteria(Criteria.where("SERVICE_CATEGORY").is(servicedto.getService_category()).and("SERVICES.SERVICE_NAME").is(servicedetail.getService_name()).and("SERVICES.VERSIONS.VERSION_NAME").is(version.getVersion_name()));
Update update=new Update().push("SERVICES.$[s].VERSIONS.$[v].GROUPS.$[].CUSTOMERS", customer).filterArray(Criteria.where("SERVICE_CATEGORY").is(servicedto.getService_category()).and("s.SERVICE_NAME").is(servicedetail.getService_name()).and("v.VERSION_NAME").is(version.getVersion_name()));
mongoOperations.updateMulti(validationquery, update, ServiceRegistrationDTO.class, collection, key,env);
抛出以下异常:
错误 com.sample.amt.mongoTemplate.MongoOperations - count(query, collectionName,key,env) :: org.springframework.dao.DataIntegrityViolationException 中的异常:解析数组过滤器时出错 :: 由 :: 预期单个顶部-level 字段名称,找到 'SERVICE_CATEGORY' 和 's';嵌套异常是 com.mongodb.MongoWriteException: Error parsing array filter :: 由 :: Expected a single top-level field name, found 'SERVICE_CATEGORY' and 's'
【问题讨论】:
-
你必须使用
$arrayFilters。位置$运算符不能用于遍历多个数组(您有嵌套数组)的查询。此外,发布更新操作的查询。 -
是的。由于 $ 运算符不能多次使用,还有哪些其他方法可以实现此目的?
-
这是一篇有类似问题的帖子(在嵌套数组中添加数组元素):stackoverflow.com/questions/60035042/…
-
@prasad_ 该帖子只有 2 层嵌套。即,数组内的数组。因此,位置操作员进行了操作。但是,就我而言,有 4 级嵌套。请建议我可以做些什么来向“客户”数组列表中添加一个元素。
-
$ positional 和
$[<id>]filtered positional operator 之间有区别。我认为您必须尝试使用过滤位置运算符。另外,我在第一条评论中已经提到您必须发布(请更新您的问题)更新操作的 查询 方面。
标签: spring mongodb spring-data spring-mongodb