程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了$push 与位置 ($) 在 upsert 失败大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决$push 与位置 ($) 在 upsert 失败?

开发过程中遇到$push 与位置 ($) 在 upsert 失败的问题如何解决?下面主要结合日常开发的经验,给出你关于$push 与位置 ($) 在 upsert 失败的解决方法建议,希望对你解决$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 合并当前对象和更新对象
    • else from not found 然后使用 $mergeObjects 连接当前 messages 数组中的新消息对象数组
  • $cocnatArrays,如果在集合中没有找到则插入新文档
upsert: true

大佬总结

以上是大佬教程为你收集整理的$push 与位置 ($) 在 upsert 失败全部内容,希望文章能够帮你解决$push 与位置 ($) 在 upsert 失败所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: