使用Spring MongoTemplate更新MongoDB中的嵌套数组

时间:2018-04-15 18:49:22

标签: spring mongodb spring-data-mongodb

任何人都可以帮助处理MongoTemplate问题吗? 我有一个具有嵌套数组的记录结构,我想更新第二级数组中的特定条目。我可以通过Set路径需要两个数组条目的索引来更容易地找到适当的条目。 '$'仅指叶项。例如,如果我有一组包含一系列玩家的团队,我需要生成一个更新路径,如:

val query = Query(Criteria.where( "teams.players.playerId").`is`(playerId))
val update = Update()
with(update) {
    set("teams.$.players.$.name", player.name)

这失败了因为'$'只能用一次来引用players数组中的索引,我需要一种方法来为teams数组中的索引生成等价的'$'。

我在想我需要使用类似的东西来使用单独的聚合查询,但我无法让它工作。

project().and(ArrayOperators.arrayOf( "markets").indexOf("")).`as`("index")

对于这个Mongo新手的任何想法?

1 个答案:

答案 0 :(得分:0)

对于其他面临类似问题的人,一种选择是在UpdateOptions中使用arrayFilters。但是看起来春季的mongotemplate尚不直接支持UpdateOptions的使用。因此,可以做的是: Sample for document which contain object with arrays of arrayObj (which contain another arrays of arrayObj).

Bson filter = eq("arrayObj.arrayObj.id", "12345");
UpdateResult result = mongoTemplate.getDb().getCollection(collectionName)
            .updateOne(filter,
                    new Document("$set", new Document("arrayObj.$[].arrayObj.$[x].someField"), "someValueToUpdate"),
                    new UpdateOptions().arrayFilters(
                            Arrays.asList(Filters.eq("x.id, "12345))
                    ));