Existe-t-il un moyen de récupérer le champ (nom de colonne) d'une collection dans MongoDb. Comme nous l'avons dans mysql comme suit :
SHOW columns FROM table_name
Ou tout autre moyen de vérifier si un champ particulier existe dans une collection.
Existe-t-il un moyen de récupérer le champ (nom de colonne) d'une collection dans MongoDb. Comme nous l'avons dans mysql comme suit :
SHOW columns FROM table_name
Ou tout autre moyen de vérifier si un champ particulier existe dans une collection.
Dans MongoDB, chaque entrée peut contenir un nombre différent de champs, ainsi que des noms de champs différents. C'est pourquoi une telle commande n'existe pas dans les API Mongo : dans MySQL, vous pouvez le faire parce que chaque ligne aura le même nombre de colonnes et les mêmes noms de colonnes. Dans MongoDB, vous ne pouvez pas faire cette supposition. Ce que vous pouvez faire, c'est vérifier si un champ est présent dans le document récupéré en utilisant simplement la commande :
if field_name in doc:
# Do stuff.
où field_name
est le nom de la "colonne" dont vous voulez vérifier l'existence et doc est la valeur actuelle de la colonne. doc
pointée par le curseur. Rappelez-vous que doc
est un dict, vous pouvez donc le traiter comme n'importe quel autre dict en Python.
Cependant, si vous souhaitez comprendre ce que vous avez dans votre collection, vous pouvez utiliser Variety comme décrit ici :
http://blog.mongodb.org/post/21923016898/meet-variety-a-schema-analyzer-for-mongodb
Il s'agit en fait d'une réduction de carte de votre collection pour trouver les champs qu'elle contient.
Comme l'a dit @JohnnyHK, vous pouvez vérifier l'existence d'un champ en utilisant $exists
: http://docs.mongodb.org/manual/reference/operator/exists/
Ce n'est pas la meilleure pratique, mais dans l'interpréteur de commandes, vous pouvez taper
Object.keys(db.posts.findOne())
Note : ceci ne vous montre pas les clés internes de l'objet, vous pouvez utiliser le map reduce pour résoudre ce problème, mais si votre objet est simple, ceci fait à peu près l'affaire.
J'ai rencontré le même problème lorsque je traitais des données hétérogènes de tiers et je l'ai résolu en utilisant le map reduce sur l'ensemble de la collection, voici le code js que j'ai utilisé au cas où vous le trouveriez utile :
function MapKeys() {
var tmp,tmpEmpty,ChildObjTp,ChildIsAr;
var levelCurrent=0;
var record=this;
function isArray(obj) {return typeof(obj)=='object'&&(obj instanceof Array);}
//function emptyIf(obj){if (obj=='tojson') {return ' ';} else {return obj+' '}; } //@note date fields return .tojson so strip it
function emptyIf(obj){if (typeof(this[obj])=='function') {return ' ';} else {return obj+' ';} } //@note date fields return .tojson so strip it
//var toType = function(obj) { // * http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/
// return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
// }
function keysToArray(obj,propArr,levelMax, _level) {
/** example: r1=keysToArray(doc,[null,[] ],2,0)
_level is used for recursion and should always called with 0
if levelMax is negative returns maximum level
levelMax=0 means top level only 2 up to 2nd depth level etc.
*/
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key] instanceof Object && ! (obj[key] instanceof Array))
if (levelMax < 0 || _level+1 <= levelMax) {
{propArr[1].push(keysToArray(obj[key],[key,[] ],levelMax,_level+1));}
}
else {} //needed coz nested if ?
{propArr[1].push(key);}
}
}
return propArr;
}
//----------------------------------------------------------------------------------------------
function arrayToStr(lst,prevKey,delimiter, inclKeys,levelMax,_level,_levelMaxFound) {
/** example: r2=arrayToStr(r1,'','|',true,2,0,0)
_level and _levelMaxFound is used for recursion and should always called with value 0
if levelMax is negative returns maximum level
levelMax=0 means top level only 2 up to 2nd depth level etc.
*/
var rt,i;
_levelMaxFound=Math.max(_level,_levelMaxFound);
if (prevKey !=='') {prevKey += '.';}
var rtStr ='';
if (lst[0]) {prevKey += lst[0]+'.';}
if (inclKeys) {rtStr += prevKey.slice(0,-1);}
for (var n in lst[1]) {
i=lst[1][n];
if (typeof(i)=='string') {
rtStr += delimiter + prevKey + i;
}
else
{
if (levelMax < 0 || _level+1 <= levelMax) {
rt=arrayToStr(i,prevKey.slice(0,-1),delimiter, inclKeys,levelMax,_level+1,_levelMaxFound);
rtStr += delimiter + rt[0];
_levelMaxFound=Math.max(rt[1],_levelMaxFound);
}
else {}
}
}
if (rtStr[0] == delimiter) {rtStr=rtStr.slice(1);} // Lstrip delimiters if any
return [rtStr,_levelMaxFound]
}
//----------------------------------------------------------------------------------------------
var keysV=keysToArray(this,[null,[] ] ,parms.levelMax, 0); // we can't sort here coz array is nested
keysV = arrayToStr(keysV,'',' ', parms.inclHeaderKeys,-1,0,0);
var MaxDepth=keysV[1];
keysV=keysV[0].split(' '); // so we can sort
keysV.sort(); // sort to make sure indentical records map to same id
keysV=keysV.join(' ');
emit ({type:'fieldsGrp',fields:keysV}, {cnt:1, percent:0.0,depth:MaxDepth,exampleIds:[this._id]});}
function ReduceKeys (key, values) {
//var total = {cnt:0,percent:0.0,exampleIds:[]}
var total = {cnt:0, percent:0.0,depth:values[0].depth,exampleIds:[]}
for(var i in values) {
total.cnt += values[i].cnt;
if (total.exampleIds.length < parms.Reduce_ExamplesMax){
total.exampleIds = values[i].exampleIds.concat(total.exampleIds);
}
}
return total;}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.