MongoDB的Java的嵌套更新

问题描述:

我有一个MongoDB的文档结构类似这样的MongoDB的Java的嵌套更新

{ 
    "_id": "002", 
    "list": [ 
    { 
     "year": "2015", 
     "entries": [{...}, {...}] 
    }, 
    { 
     "year": "2014", 
     "entries": [{...}, {...}] 
    } 
    ] 
} 

我想一个新的元素推到“项”。我知道它可以使用

collection.updateOne(
    Filters.eq("_id", "002"), 
    new Document("$push", new Document("list.0.entries", "{...}") 
); 

但是,这附加到“列表”的第一个元素的“条目”。我想追加到“年”2015年的“条目”。我怎样才能做到这一点与MongoDB Java驱动程序API(3.0)?

+0

那么是什么问题? 2015年是第一个因素。 –

我想你应该使用类似

Filters.and(Filters.eq("_id", "002"), Filters.eq("list.year", "2015")) 

PS作为过滤器的javadoc表明,这是方便使用静态导入它(使它更简洁一些,跳过“过滤器”部分)

+0

推送条目仍然有问题。 collection.updateOne(and(eq(“_ id”,“002”),eq(“list.year”,“2015”)), new Document(“$ push”,new Document(“entries”,“ {...}“) ); 这将插入一个新的键”条目“与给定值一起”列表“,而不是”列表“与”年“内的2015年作为2015 – FrankS

+0

我认为(没有时间去尝试这个atm ,抱歉),您应该使用 'list。$。entries' 而不是“entries”。请参阅http://docs.mongodb.org/manual/reference/operator/update/positional/。我希望这可以帮助您。 – vambo

您可以使用

Bson filter = Filters.and(Filters.eq("_id", "002"), Filters.eq("list", Filters.eq($elemMatch, Filters.eq("year", "2015")) Document list = collection.find().filter(filter)

之后,您可以遍历列表找到2015年,并得到这个条目通过java代码插入新元素。将更新后的列表保存在本地变量中,并通过更新命令将其写入您的mongoDB中。