当前位置: 首页 > 知识库问答 >
问题:

MongoDB奇怪的写结果行为

闾丘选
2023-03-14

我使用的是mongodb(v2.6.7)和mongo(2.6.7)shell客户端。

我正在尝试使用insert和update命令返回的WriteResult对象。

根据mongodocs,如果出现错误,它将返回一个writeResult对象,其中包含writeError子文档。但我无法在shell或mongo的javascript文件中访问此子文档。

下面是我的问题的说明。

  • 我插入一个对象,并获得成功的写结果。
  • 然后,我再次插入与相同的_id,我得到了写结果正确地打印在屏幕上,有写错误正确设置。
  • 此外,当我使用printjson()方法打印时,写结果对象似乎包含写错误
  • 但是当我用JSON. stringify()打印它时,我就看不到“写错误”了。
  • 也写esult.write错误是未定义的,所以我不能访问它的写esult.writeError.code属性。

有人能解释一下为什么会这样,正确的方法是什么吗?


afv:PRIMARY>writeResult=db.sysinfo.insert({_id:"myid",otherData:"otherDataValue"})

WriteResult({ "nInserted" : 1 })

afv:PRIMARY>writeResult=db.sysinfo.insert({_id:"myid",otherData:"otherDataValue"})

WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 11000,
        "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: afvadmin.sysinfo.$_id_  dup key: { : \"myid\" }"
    }
})

afv:PRIMARY> printjson(writeResult)
{
    "nInserted" : 0,
    "writeError" : {
        "code" : 11000,
        "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: afvadmin.sysinfo.$_id_  dup key: { : \"myid\" }"
    }
}

afv:PRIMARY> JSON.stringify(writeResult);
{"nInserted":0,"nUpserted":0,"nMatched":0,"nModified":0,"nRemoved":0}

afv:PRIMARY> writeResult.writeError

afv:PRIMARY> writeResult.nInserted
0

afv:PRIMARY> writeResult.writeError.code
2015-02-02T16:34:42.402+0530 TypeError: Cannot read property 'code' of undefined

afv:PRIMARY> writeResult["writeError"]

共有2个答案

焦正德
2023-03-14

除了使用已经提到的方法来获取WriteError对象之外,您还可以获取原始响应并对此进行处理:

> writeResult.getRawResponse()
{
    "writeErrors" : [
        {
            "index" : 0,
            "code" : 11000,
            "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: foo.bar.$_id_  dup key: { : ObjectId('54cf8152733aa5e886f0e400') }",
            "op" : {
                "_id" : ObjectId("54cf8152733aa5e886f0e400"),
                "a" : 1
            }
        }
    ],
    "writeConcernErrors" : [ ],
    "nInserted" : 0,
    "nUpserted" : 0,
    "nMatched" : 0,
    "nModified" : 0,
    "nRemoved" : 0,
    "upserted" : [ ]
}

所以,你可以做这样的事情,事情会更加一致:

> raw = writeResult.getRawResponse();
> raw.writeErrors[0].errmsg
insertDocument :: caused by :: 11000 E11000 duplicate key error index: foo.bar.$_id_  dup key: { : ObjectId('54cf8152733aa5e886f0e400') }
> printjson(raw.writeErrors[0])
{
    "index" : 0,
    "code" : 11000,
    "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: foo.bar.$_id_  dup key: { : ObjectId('54cf8152733aa5e886f0e400') }",
    "op" : {
        "_id" : ObjectId("54cf8152733aa5e886f0e400"),
        "a" : 1
    }
}    
> JSON.stringify(raw.writeErrors[0])
    {"code":11000,"index":0,"errmsg":"insertDocument :: caused by :: 11000 E11000 duplicate key error index: foo.bar.$_id_  dup key: { : ObjectId('54cf8152733aa5e886f0e400') }"}
孟凯泽
2023-03-14

我不知道为什么它是这样实现的,但是要访问包含的WriteError子文档,您可以在一个WriteResult对象上调用getWriteError()

> writeResult.getWriteError()
WriteError({
  "index": 0,
  "code": 11000,
  "errmsg": "insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.test.$_id_  dup key: { : \"myid\" }",
  "op": {
    "_id": "myid",
    "otherData": "otherDataValue"
  }
})

> writeResult.getWriteError().code
11000

我找不到任何留档。我通过在shell中键入WriteResult.后点击Tab两次来了解可用的内容。

 类似资料:
  • 当试图从Hitbox API获取数据时,我得到了一个奇怪的结果。对于一个API的命令,这种情况每次都会发生,而对于另一个API的命令,这种情况只是有时发生。结果差不多是这样(这是我得到的最后一个结果): \U001F\B\0\0\0\0\0\U0003W8SμMU~S N T&N G6C$Z%9IGF[(\U0005\U000F(:6\U000F\B P C\U0015\N\U007F V\U00

  • 我有一个程序可以读取两个文件(“incompleta.txt”和“completa.txt”),并比较两个文件中是否有相同的名称。其工作原理如下: 它将“completa.txt”中的所有名称存储在ArrayList中 问题是我的“lista.txt”看起来像这样:Image 第二条线完全是混乱和扭曲的。 我的Java代码:

  • 我使用Oracle11g(在Red Hat上)。我有一个带有XMLType列的简单常规表: 我使用Oracle SQL Developer(在Windows上): 很管用。我只有一个牢房。我可以双击并下载整个XML文件。 然后我试图以CLOB的形式得到结果: 很管用。我只有一个牢房。我可以双击并看到整个文本和复制它。但有个问题。当我把它复制到剪贴板时,我只得到前4000个字符。似乎在4000位置有

  • 问题内容: 我现在对Java左移操作有些困惑, 但 看起来像是更多的偏移值,该值的模数为32。 感谢大家对JLS的答复和报价。 我只想知道更多。是否知道以这种方式进行设计的原因?还是只是一些约定?显然C没有这个怪癖? 感谢@paxdiablo。看起来C声明了未定义的行为。 我在这里有一些个人假设: ARM体系结构参考手册A7.1.38 语法LSL Rd,Rm,#immed_5 哪里: Rd 是存储

  • 问题内容: 我有这样的事情: 我希望它会在文本区域中显示“ hello 0”,等待1秒,然后显示“ hello 1”,然后等待1秒,依此类推。 但是发生的情况有所不同,它等待5秒钟,然后显示“ hello 4”。 任何想法? 问题答案: 是的-您基本上是在阻止UI线程,因此永远不会回避实际更新。 在UI线程中休眠是一个非常糟糕的主意。 如果您想执行类似的操作,则应使用。(我假设您正在使用Swing

  • 我正在使用Weka Gui-Explorer,我想根据类{男性,女性}对我的数据进行分类。我使用MultiBoostAB分类器,以REPTree分类器为基础。我正在尝试使用训练集(557个实例)评估我的分类器的准确性 然后是一个具有大约300个属性的测试集(200个实例)。准确率83,5% - 167从200个实例中正确分类,kappa统计量为0,67。我保存了这个模型,并用它来预测 其他未知数据