MongoDB,我如何更新集合中的嵌入式文档,或者如果没有';不存在?

MongoDB,我如何更新集合中的嵌入式文档,或者如果没有';不存在?,mongodb,Mongodb,如果单个查询中不存在嵌入文档,如何更新集中的嵌入文档或插入其中的文档? 假设我有一份如下的文件。“记录”是一组嵌入的文档 { id: "1", records: [ {userId:"5", userData: "..."}, {userId:"12", userData: "..."}, {userId:"27", userData: "..."} ] } 我知道如何在单独的查询中插入或更新“记录”。但是我可以合并这些查

如果单个查询中不存在嵌入文档,如何更新集中的嵌入文档或插入其中的文档? 假设我有一份如下的文件。“记录”是一组嵌入的文档

{
    id: "1",
    records: [
        {userId:"5", userData: "..."},
        {userId:"12", userData: "..."},
        {userId:"27", userData: "..."}
    ]
}
我知道如何在单独的查询中插入或更新“记录”。但是我可以合并这些查询,使其在重复密钥更新上与MySQL的工作方式类似吗?我希望避免执行另一个查询,只是为了确定是否存在嵌入的文档

db.myCollection.update(
    {id:"1", records.userId:"12"},
    {records.$.userData:{"... new data ..."}}
);

db.myCollection.update(
    {id:"1"},
    {records:
        {$push:
            {userId: "33", userData: {"... new data ..."}}
        }
    }
);
谢谢你可以用Upsert

您可以使用Upsert


我确实有一个答案,但Stack Overflow决定将其转换为评论。嗨,Na.z.Camp,你还有指向你所指的“评论”的链接吗?可能是Thank JohnnyHK的重复,我也考虑过将“记录”结构化为一个对象。然而,这引发了最初提问者提到的索引问题。这不适用于“记录”中存储的数据类型。我确实有一个答案,但Stack Overflow决定将其转换为注释。嗨,Na.z.Camp,你还有指向你所指的“注释”的链接吗?感谢JohnnyHK的可能副本,我也考虑过将“记录”作为对象进行结构化。然而,这引发了最初提问者提到的索引问题。这不适用于“记录”中存储的数据类型。嗨,SCB,据我所知,upsert不适用于嵌入式文档。请注意,我只想修改主文档的“记录”集。您是否可以使用update命令上的/*upsert*/true组合并使用位置运算符$?@SCB,MongoDB文档说“不要将位置运算符$用于upsert操作,因为inserts将在插入的文档中使用$作为字段名。”请看这里:Hi SCB,据我所知,upsert不适用于嵌入式文档。请注意,我只想修改主文档的“记录”集。您是否可以使用update命令上的/*upsert*/true组合并使用位置运算符$?@SCB,MongoDB文档说“不要将位置运算符$用于upsert操作,因为inserts将在插入的文档中使用$作为字段名。”请看这里: