我的文件结构如下:
{
"_id" : 1000001,
"ListMembers" : [
{
"MemberID" : 1000,
"Notes" : "Test Notes for 1000"
},
{
"MemberID" : 1001,
"Notes" : "Test Notes for 1002"
}
]
}
应用程序生成唯一ID。 我需要实现以下目标:
这里#1和#2工作正常,但{upsert:true}选项对上面的#3不起作用;如果文档存在但成员记录不存在,它会尝试插入具有相同Id的新文档,这显然会给我一个重复键错误。在这种情况下MongoDB是否支持UPSERT操作,或者我是否需要检查文档的存在,然后执行INSERT for#1和($ pull和$ push)以在阵列字段上实现#2和#3。
答案 0 :(得分:0)
目前不支持此功能,因为$
positional operator不支持upserting:
不要将位置运算符$与upsert运算一起使用,因为insert将在插入的文档中使用$作为字段名称。
位置操作员需要更新成员记录的注释,但不能用于upsert。
我建议的逻辑是执行更新查询以涵盖#2和#3 - 我确保writeconcern为1 - 因此它返回更新的文档数。如果它没有返回,则执行插入以将项目推送到ListMembers
- 这涵盖了#1 *
*此处存在潜在竞争条件 - 当您尝试$push
检查与不匹配<{1}}时,您应该确保额外的积分方面并设置writeconcern。如果ListMembers
操作返回0 - 这意味着文档在第一个操作和第一个操作之间进行了更新,因此您现在可以继续使用$push
,因为现在匹配并且它将更新它。