Mongodb java Mongodb Java嵌套更新

Mongodb java Mongodb Java嵌套更新,mongodb-java,mongodb-update,Mongodb Java,Mongodb Update,我有一个像这样的MongoDB文档结构 { "_id": "002", "list": [ { "year": "2015", "entries": [{...}, {...}] }, { "year": "2014", "entries": [{...}, {...}] } ] } 我想在“条目”中加入一个新元素。我知道这是可能的使用 collection.updateOne( Filters

我有一个像这样的MongoDB文档结构

{
  "_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)实现这一点?

我认为您应该使用

Filters.and(Filters.eq("_id", "002"), Filters.eq("list.year", "2015"))
PS正如Filters javadoc所建议的那样,对其使用静态导入很方便(通过跳过“Filters.”部分使其不那么冗长)

您可以使用

Bson filter=Filters.and(Filters.eq(“_id”,“002”),Filters.eq(“列表”,Filters.eq($elemMatch,Filters.eq(“年份”,“2015”))
文档列表=collection.find().filter(过滤器)


之后,您可以遍历列表以查找2015年,并获取该年的条目,然后通过java代码插入新元素。将更新后的列表保存在局部变量中,并通过更新命令将该列表写入mongoDB。

那么,问题出在哪里?2015年是第一个元素。推送条目时仍有问题。collection.updateOne(和(eq(“_id”,“002”)、eq(“list.year”,“2015”)、新文档($push)、新文档(“entries”、“{…}”);这将在“list”旁边插入一个具有给定值的新键“entries”,而不是像2015年那样插入带有“year”的“list”,我想(没时间尝试这个atm),您应该使用
list.$.entries
,而不是“entries”.看,我希望这会有帮助。