MongoDB странное поведение writeResult

Я использую клиент оболочки mongodb (v2.6.7) и mongo (2.6.7).

Я пытаюсь использовать объект WriteResult, возвращаемый командами вставки и обновления.

Согласно mongodocs, в случае ошибки он возвращает объект writeResult с вложенным документом writeError. Но я не могу получить доступ к этому поддокументу в оболочке или в файле javascript mongo.

Ниже приведена иллюстрация моей проблемы.

  • Я вставляю объект и получаю успешный результат записи.
  • Затем я снова вставляю с тем же _id, и я получаю, что writeResult правильно напечатан на экране, на котором правильно установлено «writeError».
  • Также объект writeResult, кажется, содержит ошибку writeError, когда я печатаю ее с помощью метода printjson ()
  • Но когда я печатаю его с помощью JSON.stringify (), я не вижу «writeError».
  • Также writeResult.writeError приходит как undefined, поэтому я не могу получить доступ к его свойству writeResult.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"]


person Nitiraj    schedule 02.02.2015    source источник


Ответы (2)


Я не знаю, почему это было реализовано таким образом, но для доступа к вложенному writeError поддокументу вы вызываете getWriteError() для объекта WriteResult:

> 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

Я не смог найти для этого никакой документации. Я понял это, дважды нажав Tab после ввода writeResult. в оболочке, чтобы посмотреть, что доступно.

person JohnnyHK    schedule 02.02.2015

В дополнение к использованию методов для получения объекта 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') }"}
person Adam Comerford    schedule 02.02.2015