with related query mongo inside example collection mongodb doctrine hidden invisible dbref

mongodb - related - Los campos adicionales de Mongo dbref son invisibles en mongoshell. ¿Cómo mostrarlos?



mongodb relational query (1)

Antecedentes: Este problema surgió con Doctrine ODM, que utiliza un campo _doctrine_class_name en DBRefs que es invisible en el shell de Mongo (2.2.2) y que causó un gran error, cuando tuvimos que actualizar un registro manualmente.

Ejemplo:

mongoshell> use testdb; // for safety mongoshell> a = DBRef("layout_block", ObjectId("510a71fde1dc610965000005")); // create a dbref mongoshell> a.hiddenfield = "whatever" // add a field that''s normally not there like Doctrine does mongoshell> a // view it''s contents, you won''t see hiddenfield mongoshell> for (k in a) { var val = a[k]; print( k + "(" + typeof(val) + "): " + val ); } // you can see that there''s more if you iterate through it mongoshell> db.testcoll.save({ref: [ a ]}) // you can have it in a collection mongoshell> db.testcoll.findOne(); // and normally you won''t see it

Sin una iteración como el tercer comando desde abajo (o MongoVue), nunca sabrá que hay más en un DBRef si simplemente usa find (). No he encontrado ningún modificador utilizable para find () (intentado: toArray, tojson, printjson, toString, hex, base64, bonito, hablador, detallado, ...).

¿Alguien ha encontrado un método para mostrar los contenidos de DBRef en forma impecable en mongo shell?


El shell Mongo es una extensión de Mozilla SpiderMonkey (1.7?) Y tiene una funcionalidad muy básica.

La sugerencia de una publicación de blog de MongoDB en el shell es definir la siguiente función de inspect en .mongorc.js en su directorio de inicio

function inspect(o, i) { if (typeof i == "undefined") { i = ""; } if (i.length > 50) { return "[MAX ITERATIONS]"; } var r = []; for (var p in o) { var t = typeof o[p]; r.push(i + "/"" + p + "/" (" + t + ") => " + (t == "object" ? "object:" + inspect(o[p], i + " ") : o[p] + "")); } return r.join(i + "/n"); }

Además, puede redefinir la función DBRef.toString de la siguiente manera:

DBRef.prototype.toString = function () { var r = [''"$ref": '' + tojson(this.$ref), ''"$id": '' + tojson(this.$id)]; var o = this; for (var p in o) { if (p !== ''$ref'' && p !== ''$id'') { var t = typeof o[p]; r.push(''"'' + p + ''" ('' + t + '') : '' + (t == ''object'' ? ''object: {...}'' : o[p] + '''')); } } return ''DBRef('' + r.join('', '') + '')''; };