大佬教程收集整理的这篇文章主要介绍了$push 与位置 ($) 在 upsert 失败,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我想 $push
嵌套数组中的消息文档,在三种情况下 updateOne。文件是:
{
"_ID" : ObjectID("60db4301db16e85753c4eeef"),"to" : "111","messages" : [
{
"from" : "222","subMessages" : [
{
"message" : "test","date" : ISODate("2021-06-29T15:57:53.975Z")
}
]
}
]
}
Case 1 (successfull):如果指定的 messages.from
字段存在于 messages
数组中,查询成功如下:
db.pendingMessages.deleteMany({});
db.pendingMessages.insert([{
"_ID" : ObjectID("60db4301db16e85753c4eeef"),"date" : ISODate("2021-06-29T15:57:53.975Z")
}
]
}
]
}]);
db.pendingMessages.updateOne(
{to: "111","messages.from": "222"},{$push: {"messages.$.subMessages": {message: "test2",date: ISODate("2021-06-29T15:57:53.975Z")}}},{upsert: true}
);
case 2 (Failed): 如果数组中不存在 messages.from
字段,则 updateOne 会失败,如下所示:
db.pendingMessages.deleteMany({});
db.pendingMessages.insert([{
"_ID" : ObjectID("60db4301db16e85753c4eeef"),"messages.from": "333"},{upsert: true}
);
错误信息: "errmsg" : "位置运算符未从查询中找到所需的匹配项。"
情况 3(失败):如果文档不存在,则 {upsert: true}
必须插入具有指定 to
字段的文档。代码如下:
db.pendingMessages.deleteMany({});
db.pendingMessages.updateOne(
{to: "111",{upsert: true}
);
错误信息: "errmsg" : "位置运算符未从查询中找到所需的匹配项。"
如何克服这两种情况的错误问题?任何代码和帮助将不胜感激。
Upsert 在更新查询中的嵌套文档中不起作用,
如果您想在单个查询中完成,您可以尝试使用聚合查询进行复杂更新来处理您的情况,
让我们举一个例子输入,看看例子,
情况 1:如果指定的 messages.from
字段存在于 messages
数组中
var to = "111";
var from = "222";
var subMessage = {
message: "test",date: ISODate("2021-06-29T15:57:53.975Z")
};
Playground
情况 2:如果数组中不存在 messages.from
字段
var to = "111";
var from = "333";
var subMessage = {
message: "test2",date: ISODate("2021-06-29T15:57:53.975Z")
};
Playground
情况 3:如果文档不存在
var to = "111";
var from = "333";
var subMessage = {
message: "test2",date: ISODate("2021-06-29T15:57:53.975Z")
};
Playground
您的最终查询是,
to
条件from
数组中找到 messages
,则:
$map
迭代 messages
数组的循环并检查条件,如果 from
找到,然后使用 {{1} 将当前 subMessages
数组与新输入 subMessage
连接起来},$concatArrays
合并当前对象和更新对象$mergeObjects
连接当前 messages
数组中的新消息对象数组$cocnatArrays
,如果在集合中没有找到则插入新文档upsert: true
以上是大佬教程为你收集整理的$push 与位置 ($) 在 upsert 失败全部内容,希望文章能够帮你解决$push 与位置 ($) 在 upsert 失败所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。