6

MongoDbでコレクションのフィールド(列名)をフェッチする方法はありますか?次のようにmysqlにあるように:

SHOW columns FROM table_name

または、特定のフィールドがコレクションに存在するかどうかを確認する方法。

4

5 に答える 5

2

コレクション内の各ドキュメントは独立しているため、最初の質問はありません。2番目の質問はい(を使用$exists):

# Get the count of docs that contain field 'fieldname'
db.coll.find({'fieldname': {'$exists': 1}}).count()
于 2013-03-05T14:32:09.127 に答える
1

各ドキュメントは互いに分離されているため、これを行う簡単な方法はありませんが、コレクションに何があるかを理解したい場合は、ここで説明するようにVarietyを使用できます。

http://blog.mongodb.org/post/21923016898/meet-variety-a-schema-analyzer-for-mongodb

それは基本的にあなたがどんなフィールドを持っているかを見つけるためにあなたのコレクションをマップリデュースします。

@JohnnyHKが言ったように、次を使用してフィールドの存在を確認できます: http$exists : //docs.mongodb.org/manual/reference/operator/exists/

于 2013-03-05T16:17:16.453 に答える
1

これはベストプラクティスではありませんが、シェルで入力できます

Object.keys(db.posts.findOne())

注: これはオブジェクトの内部キーを表示しません。map reduce を使用してこれを解決できますが、オブジェクトが単純な場合は、これでほとんどのタスクが実行されます。

于 2013-11-25T18:28:17.950 に答える
1

MongoDB では、すべてのエントリにさまざまな数のフィールドとさまざまなフィールド名を含めることができます。そのため、このようなコマンドは Mongo API にはありません。MySQL では、すべての行に同じ数の列と同じ列名があるため、実行できます。MongoDB では、この仮定を行うことはできません。できることは、次の方法で、取得したドキュメントにフィールドがあるかどうかを確認することです。

if field_name in doc:
    # Do stuff.

wherefield_nameは存在を確認する「列」の名前であり、doc はdocカーソルが現在指している場所です。これは dict であることを忘れないでくださいdoc。したがって、Python で他の dict を扱うのと同じように扱うことができます。

于 2013-03-05T14:28:38.273 に答える
0

サードパーティの異種データを処理しているときに同じ問題に直面し、コレクション全体でmap reduceを使用して解決しました。これは、役立つ場合に使用したjsコードです。

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;} 
于 2013-03-05T15:05:20.080 に答える