2015-02-02 1 views
4

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

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

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

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

  • Я вставляю объект и получаю успешный writeResult.
  • Затем я снова вставляю один и тот же _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"] 

ответ

7

Я не знаю, почему он был реализован таким образом, но для доступа к содержащемуся 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. в оболочке, чтобы посмотреть, что доступно.

0

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