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('', '') + '')'';
};