সংগ্রহের সমস্ত কীগুলির নাম পান


322

আমি একটি মঙ্গোডিবি সংগ্রহের সমস্ত কীগুলির নাম পেতে চাই।

উদাহরণস্বরূপ, এটি থেকে:

db.things.insert( { type : ['dog', 'cat'] } );
db.things.insert( { egg : ['cat'] } );
db.things.insert( { type : [] } );
db.things.insert( { hello : []  } );

আমি অনন্য কীগুলি পেতে চাই:

type, egg, hello

উত্তর:


346

আপনি মানচিত্রের সাহায্যে এটি করতে পারেন:

mr = db.runCommand({
  "mapreduce" : "my_collection",
  "map" : function() {
    for (var key in this) { emit(key, null); }
  },
  "reduce" : function(key, stuff) { return null; }, 
  "out": "my_collection" + "_keys"
})

তারপরে ফলাফলটি সংগ্রহের ক্ষেত্রে স্বতন্ত্র চালান যাতে সমস্ত কীগুলি খুঁজে পাওয়া যায়:

db[mr.result].distinct("_id")
["foo", "bar", "baz", "_id", ...]

2
হাই! আমি এই স্নিপেটকে কীভাবে ডেটা স্ট্রাকচারের গভীর স্তরে অবস্থিত কীগুলির সাহায্যে জিজ্ঞাসা করতে একটি ফলো-আপ পোস্ট করেছি ( স্ট্যাকওভারফ্লো / প্রশ্ন / 2997004/… )।
Andrea Fiore

1
@ ক্রিস্টিনা: কীভাবে সম্ভব যে জিনিসগুলি সংগ্রহ করার সময় আমি কীগুলি দিয়ে সম্পূর্ণ জিনিস তালিকাভুক্ত করেছি । এটি ইতিহাসের ব্যবস্থার সাথে সম্পর্কিত বলে মনে হচ্ছে কারণ আমি অতীতে যা সংশোধন করেছি সেগুলি পেয়েছি ..
শ্যান

3
আমি জানি এটি একটি পুরানো থ্রেড, তবে আমারও একইরকম প্রয়োজন বলে মনে হচ্ছে। আমি নোডেজ মঙ্গোদব নেটিভ ড্রাইভার ব্যবহার করছি। ফলস্বরূপ অস্থায়ী সংগ্রহটি সর্বদা শূন্য বলে মনে হচ্ছে। আমি এর জন্য সংগ্রহের ক্লাসে ম্যাপ্রেডস ফাংশনটি ব্যবহার করছি। এটা কি সম্ভব না?
দীপক

6
এটি সুস্পষ্ট হতে পারে তবে আপনি যদি একটি for (var key in this.first_level.second_level.nth_level) { emit(key, null); }
সাব

3
কোনও সংগ্রহে সঞ্চয় করার পরিবর্তে তারপরে স্বতন্ত্র চলমান পরিবর্তে আমি মানচিত্রটি ব্যবহার করি ():db.runCommand({..., out: { "inline" : 1 }}).results.map(function(i) { return i._id; });
ইয়ান স্ট্যানলি

203

সঙ্গে ক্রিস্টিনা এর উত্তর : অনুপ্রেরণা, আমি বিভিন্নতা নামক একটি ওপেন সোর্স টুল যা ঠিক এই আছে নির্মিত https://github.com/variety/variety


13
এটি একটি দুর্দান্ত সরঞ্জাম, অভিনন্দন। এটি প্রশ্নটি ঠিক কী করে তা করে এবং সীমা, গভীরতা ইত্যাদি দ্বারা কনফিগার করা যায় যারা অনুসরণ করে তার দ্বারা প্রস্তাবিত।
পল বিগগার

74

আপনি নতুন সঙ্গে অ্যাগ্রিগেশন ব্যবহার করতে পারেন $objectToArrrayমধ্যে 3.4.4সংস্করণ সমস্ত শীর্ষস্থানীয় কী & মান জোড়া দ্বারা অনুসরণ ডকুমেন্ট অ্যারে মধ্যে রূপান্তর করতে $unwind& $group সঙ্গে $addToSetসম্পূর্ণ সংগ্রহ জুড়ে স্বতন্ত্র কী জন্য।

$$ROOT শীর্ষ স্তরের নথি রেফারেন্স জন্য।

db.things.aggregate([
  {"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}},
  {"$unwind":"$arrayofkeyvalue"},
  {"$group":{"_id":null,"allkeys":{"$addToSet":"$arrayofkeyvalue.k"}}}
])

আপনি একটি নথিতে চাবি পেতে নীচের ক্যোয়ারী ব্যবহার করতে পারেন।

db.things.aggregate([
  {"$match":{_id: "5e8f968639bb8c67726686bc"}}, /* Replace with the document's ID */
  {"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}},
  {"$project":{"keys":"$arrayofkeyvalue.k"}}
])

20
এটি সত্যই সেরা উত্তর। কিছু অন্যান্য প্রোগ্রামিং ভাষা বা প্যাকেজ জড়িত না করেই সমস্যার সমাধান করে এবং সামগ্রিক কাঠামো সমর্থন করে এমন সমস্ত ড্রাইভারের সাথে কাজ করে (এমনকি উল্কাও!)
মিকাহ হেনিং

2
যদি আপনি একটি "অ্যালেকিস" কী দিয়ে একক মানচিত্রে প্রবেশকারী কার্সারের পরিবর্তে কোনও অ্যারেটি ফিরিয়ে দিতে চান তবে আপনি .next()["allkeys"]কমান্ডটিতে সংযোজন করতে পারেন (ধরে নিলে সংগ্রহের কমপক্ষে একটি উপাদান রয়েছে)।
এম জাস্টিন

19

এটা চেষ্টা কর:

doc=db.thinks.findOne();
for (key in doc) print(key);

49
এটি একটি সংগ্রহের মধ্যে একক দস্তাবেজের ক্ষেত্রকে আউটপুট দেয় বলে ভুল উত্তর - অন্য সবার কাছে সম্পূর্ণ আলাদা কী থাকতে পারে।
অস্যা কামস্কি

15
এটি এখনও আমার কাছে সবচেয়ে কার্যকর উত্তর, একটি সাধারণ যুক্তিসঙ্গত ন্যূনতম।
বরিস বুর্কভ

11
এটি দরকারী না? এটি আপনাকে ভুল উত্তর দিলে কীভাবে কার্যকর?
Zlatko

4
প্রসঙ্গটি কী ব্যবহারযোগ্য তা দেখায়: যদি ডেটাটি স্বাভাবিক করা হয় (উদাহরণস্বরূপ, সিএসভি ফাইল থেকে ওরিজেন), এটি দরকারী ... এসকিউএল থেকে আমদানিকৃত ডেটা দরকারী।
পিটার ক্রাউস

5
এটি একটি ভাল উত্তর না কিভাবে এটা কি পেতে উপর একটি উত্তর এক সংগ্রহে নেই উপাদান সব সংগ্রহে কী!
যোনাতান

16

যদি আপনার লক্ষ্য সংগ্রহ খুব বেশি না হয় তবে আপনি এটি মঙ্গো শেল ক্লায়েন্টের অধীনে চেষ্টা করতে পারেন:

var allKeys = {};

db.YOURCOLLECTION.find().forEach(function(doc){Object.keys(doc).forEach(function(key){allKeys[key]=1})});

allKeys;

যদি আমি দেখতে চাই তবে আমি কীভাবে নির্দিষ্ট কীগুলির জন্য রেজিএক্সপ্যাক দিতে পারি?
TB.M

@ টিবি.এম আপনি এটি চেষ্টা করে দেখতে পারেন: db.configs.find ()। ForEach (ফাংশন (ডক) {অবজেক্ট.কিজ (ডক)) .Each (ফাংশন (কী)) {যদি (/YOURREGEXP/.test(key)) { allKeys [Key] = 1}})});
লি চুনলিন

এখানে পরীক্ষার মানে কী? আপনি দয়া করে ব্যাখ্যা করতে পারেন?
টিবি.এম


14

পাইমোঙ্গো ব্যবহার করে একটি পরিষ্কার এবং পুনরায় ব্যবহারযোগ্য সমাধান:

from pymongo import MongoClient
from bson import Code

def get_keys(db, collection):
    client = MongoClient()
    db = client[db]
    map = Code("function() { for (var key in this) { emit(key, null); } }")
    reduce = Code("function(key, stuff) { return null; }")
    result = db[collection].map_reduce(map, reduce, "myresults")
    return result.distinct('_id')

ব্যবহার:

get_keys('dbname', 'collection')
>> ['key1', 'key2', ... ]

1
দুর্দান্ত কাজ করে। অবশেষে আমার সমস্যার সমাধান হয়ে গেল .... স্ট্যাক ওভারফ্লোতে দেখেছি এটিই সবচেয়ে সহজ সমাধান ..
স্মাক আলফা

এবং টাইপ করে ফিল্টার করতে, যেমন if (typeof(this[key]) == 'number')আগে উদাহরণ যোগ করুন emit(key, null)
স্কিপি লে গ্র্যান্ড গৌরো

10

পাইথন ব্যবহার করা। সংগ্রহের সমস্ত শীর্ষ-স্তরের কীগুলির সেটটি ফেরত দেয়:

#Using pymongo and connection named 'db'

reduce(
    lambda all_keys, rec_keys: all_keys | set(rec_keys), 
    map(lambda d: d.keys(), db.things.find()), 
    set()
)

1
আমি এটি কাজ করতে পেয়েছি কিন্তু এটি কাঁচা মঙ্গোদ ক্যোয়ারীর সাথে তুলনা করে কতটা দক্ষ?
যিশু গোমেজ

1
আমি নিশ্চিত যে এটি সরাসরি মোঙ্গোডবে করার তুলনায় চূড়ান্তভাবে অকার্যকর
ইনগো ফিশার

9

পাইথনে কাজ করা নমুনাটি এখানে: এই নমুনা ফলাফলগুলিকে ইনলাইন দেয়।

from pymongo import MongoClient
from bson.code import Code

mapper = Code("""
    function() {
                  for (var key in this) { emit(key, null); }
               }
""")
reducer = Code("""
    function(key, stuff) { return null; }
""")

distinctThingFields = db.things.map_reduce(mapper, reducer
    , out = {'inline' : 1}
    , full_response = True)
## do something with distinctThingFields['results']

9

আপনি যদি মঙ্গোদব ৩.৪.৪ এবং তার বেশি ব্যবহার করে থাকেন তবে আপনি নীচে সমষ্টি ব্যবহার করে $objectToArrayএবং $groupসমষ্টিটি ব্যবহার করতে পারেন

db.collection.aggregate([
  { "$project": {
    "data": { "$objectToArray": "$$ROOT" }
  }},
  { "$project": { "data": "$data.k" }},
  { "$unwind": "$data" },
  { "$group": {
    "_id": null,
    "keys": { "$addToSet": "$data" }
  }}
])

এখানে কাজের উদাহরণ


এটি সেরা উত্তর। আপনি $matchএকত্রিতকরণ পাইপলাইনটির শুরুতে কেবলমাত্র শর্তের সাথে মেলে এমন নথির কীগুলি পেতে ব্যবহার করতে পারেন ।
রোনকিলোএইন

5

আমি অবাক হচ্ছি, এখানে কারও কাছেই সদৃশ javascriptSetলজিক ব্যবহার করে সদৃশ মানগুলি স্বয়ংক্রিয়ভাবে ফিল্টার করতে উত্তর নেই , মঙ্গো শেলের উপর নীচের মতো সাধারণ উদাহরণ :

var allKeys = new Set()
db.collectionName.find().forEach( function (o) {for (key in o ) allKeys.add(key)})
for(let key of allKeys) print(key)

এটি সংগ্রহের নামে সমস্ত সম্ভাব্য অনন্য কী মুদ্রণ করবে : সংগ্রহের নাম ।


3

এটি আমার পক্ষে ভাল কাজ করে:

var arrayOfFieldNames = [];

var items = db.NAMECOLLECTION.find();

while(items.hasNext()) {
  var item = items.next();
  for(var index in item) {
    arrayOfFieldNames[index] = index;
   }
}

for (var index in arrayOfFieldNames) {
  print(index);
}

3

আমি মনে করি যে এখানে সর্বোপরি উল্লিখিত হিসাবে এটি করার সর্বোত্তম উপায়টি মঙ্গড ৩.৪.৪++ তে রয়েছে তবে $unwindঅপারেটরটি ব্যবহার না করে এবং পাইপলাইনে মাত্র দুটি পর্যায় ব্যবহার না করে। পরিবর্তে আমরা $mergeObjectsএবং $objectToArrayঅপারেটরগুলি ব্যবহার করতে পারি ।

ইন $groupপর্যায়ে, আমরা ব্যবহার$mergeObjects অপারেটর একটি একক নথি ফেরত দিতে যেখানে কী / মান সংগ্রহ সমস্ত কাগজপত্র থেকে।

তারপরে আসে $projectযেখানে আমরা ব্যবহার করি $mapএবং $objectToArrayকীগুলি ফিরিয়ে আনতে।

let allTopLevelKeys =  [
    {
        "$group": {
            "_id": null,
            "array": {
                "$mergeObjects": "$$ROOT"
            }
        }
    },
    {
        "$project": {
            "keys": {
                "$map": {
                    "input": { "$objectToArray": "$array" },
                    "in": "$$this.k"
                }
            }
        }
    }
];

এখন যদি আমাদের কাছে নেস্টেড ডকুমেন্ট থাকে এবং কীগুলিও পেতে চান তবে এটি কার্যকর। সরলতার জন্য, এর মতো দেখতে সাধারণ এমবেডড ডকুমেন্ট সহ একটি দস্তাবেজ বিবেচনা করুন:

{field1: {field2: "abc"}, field3: "def"}
{field1: {field3: "abc"}, field4: "def"}

নিম্নলিখিত পাইপলাইনে সমস্ত কী পাওয়া যায় (ফিল্ড 1, ফিল্ড 2, ফিল্ড 3, ফিল্ড 4)

let allFistSecondLevelKeys = [
    {
        "$group": {
            "_id": null,
            "array": {
                "$mergeObjects": "$$ROOT"
            }
        }
    },
    {
        "$project": {
            "keys": {
                "$setUnion": [
                    {
                        "$map": {
                            "input": {
                                "$reduce": {
                                    "input": {
                                        "$map": {
                                            "input": {
                                                "$objectToArray": "$array"
                                            },
                                            "in": {
                                                "$cond": [
                                                    {
                                                        "$eq": [
                                                            {
                                                                "$type": "$$this.v"
                                                            },
                                                            "object"
                                                        ]
                                                    },
                                                    {
                                                        "$objectToArray": "$$this.v"
                                                    },
                                                    [
                                                        "$$this"
                                                    ]
                                                ]
                                            }
                                        }
                                    },
                                    "initialValue": [

                                    ],
                                    "in": {
                                        "$concatArrays": [
                                            "$$this",
                                            "$$value"
                                        ]
                                    }
                                }
                            },
                            "in": "$$this.k"
                        }
                    }
                ]
            }
        }
    }
]

অল্প চেষ্টা করে আমরা একটি অ্যারে ক্ষেত্রে সমস্ত সাবডোকামেন্টের কীটি পেতে পারি যেখানে উপাদানগুলিও বস্তুযুক্ত।


হ্যাঁ $unwind সংগ্রহটি বিস্ফোরিত হবে (নং ক্ষেত্রগুলি * নং দস্তাবেজগুলির), আমরা $mergeObjectsসমস্ত সংস্করণে> 3.6এটিকে এড়াতে পারি > .. একই কাজটি করা উচিত, আগে এই উত্তরটি দেখে নেওয়া উচিত ছিল, আমার জীবন সেই উপায়ে আরও সহজ হত ( -_-)
হোয়ামি

3

সম্ভবত সামান্য অফ-টপিক, তবে আপনি কোনও বস্তুর সমস্ত কী / ক্ষেত্র পুনরাবৃত্তভাবে সুন্দর-মুদ্রণ করতে পারেন:

function _printFields(item, level) {
    if ((typeof item) != "object") {
        return
    }
    for (var index in item) {
        print(" ".repeat(level * 4) + index)
        if ((typeof item[index]) == "object") {
            _printFields(item[index], level + 1)
        }
    }
}

function printFields(item) {
    _printFields(item, 0)
}

যখন সংগ্রহের সমস্ত বস্তুর কাঠামোগত একই থাকে তখন কার্যকর।


1

সমস্ত কী বিয়োগের একটি তালিকা পেতে _id, নিম্নলিখিত সামগ্রিক পাইপলাইন চালানো বিবেচনা করুন:

var keys = db.collection.aggregate([
    { "$project": {
       "hashmaps": { "$objectToArray": "$$ROOT" } 
    } }, 
    { "$project": {
       "fields": "$hashmaps.k"
    } },
    { "$group": {
        "_id": null,
        "fields": { "$addToSet": "$fields" }
    } },
    { "$project": {
            "keys": {
                "$setDifference": [
                    {
                        "$reduce": {
                            "input": "$fields",
                            "initialValue": [],
                            "in": { "$setUnion" : ["$$value", "$$this"] }
                        }
                    },
                    ["_id"]
                ]
            }
        }
    }
]).toArray()[0]["keys"];

0

আমি নোডেজে লেখার চেষ্টা করছিলাম এবং অবশেষে এটি নিয়ে এসেছি:

db.collection('collectionName').mapReduce(
function() {
    for (var key in this) {
        emit(key, null);
    }
},
function(key, stuff) {
    return null;
}, {
    "out": "allFieldNames"
},
function(err, results) {
    var fields = db.collection('allFieldNames').distinct('_id');
    fields
        .then(function(data) {
            var finalData = {
                "status": "success",
                "fields": data
            };
            res.send(finalData);
            delteCollection(db, 'allFieldNames');
        })
        .catch(function(err) {
            res.send(err);
            delteCollection(db, 'allFieldNames');
        });
 });

সদ্য নির্মিত সংগ্রহ "অলফিল্ডনামস" পড়ার পরে, এটি মুছুন।

db.collection("allFieldNames").remove({}, function (err,result) {
     db.close();
     return; 
});

0

মঙ্গোলডব ডকুমেন্টেশন অনুসারে , এর সংমিশ্রণdistinct

একটি একক সংগ্রহ বা দেখুন জুড়ে একটি নির্দিষ্ট ক্ষেত্রের জন্য স্বতন্ত্র মানগুলি সন্ধান করে এবং ফলাফলগুলি অ্যারেতে ফেরত দেয়।

এবং সূচী সংগ্রহের ক্রিয়াকলাপগুলি কোনও প্রদত্ত কী বা সূচকের জন্য সমস্ত সম্ভাব্য মান ফেরত দেয়:

সংগ্রহের বিদ্যমান সূচীগুলি সনাক্ত এবং বর্ণনা করে এমন নথিগুলির একটি তালিকা ধারণ করে এমন একটি অ্যারে ফেরত দেয়

সুতরাং একটি প্রদত্ত পদ্ধতিতে এটি নীচের মতো একটি পদ্ধতি ব্যবহার করতে পারে, এটির জন্য নিবন্ধিত সমস্ত সূচকের জন্য সংগ্রহ জিজ্ঞাসা করতে এবং ফিরে আসতে, কীগুলির জন্য সূচীগুলির সাথে একটি অবজেক্টটি বলতে (উদাহরণটি নোডজেএস-এর জন্য অ্যাসিঙ্ক / অপেক্ষারত ব্যবহার করে, তবে স্পষ্টতই আপনি অন্য কোনও অ্যাসিনক্রোনাস পদ্ধতির ব্যবহার করতে পারেন):

async function GetFor(collection, index) {

    let currentIndexes;
    let indexNames = [];
    let final = {};
    let vals = [];

    try {
        currentIndexes = await collection.indexes();
        await ParseIndexes();
        //Check if a specific index was queried, otherwise, iterate for all existing indexes
        if (index && typeof index === "string") return await ParseFor(index, indexNames);
        await ParseDoc(indexNames);
        await Promise.all(vals);
        return final;
    } catch (e) {
        throw e;
    }

    function ParseIndexes() {
        return new Promise(function (result) {
            let err;
            for (let ind in currentIndexes) {
                let index = currentIndexes[ind];
                if (!index) {
                    err = "No Key For Index "+index; break;
                }
                let Name = Object.keys(index.key);
                if (Name.length === 0) {
                    err = "No Name For Index"; break;
                }
                indexNames.push(Name[0]);
            }
            return result(err ? Promise.reject(err) : Promise.resolve());
        })
    }

    async function ParseFor(index, inDoc) {
        if (inDoc.indexOf(index) === -1) throw "No Such Index In Collection";
        try {
            await DistinctFor(index);
            return final;
        } catch (e) {
            throw e
        }
    }
    function ParseDoc(doc) {
        return new Promise(function (result) {
            let err;
            for (let index in doc) {
                let key = doc[index];
                if (!key) {
                    err = "No Key For Index "+index; break;
                }
                vals.push(new Promise(function (pushed) {
                    DistinctFor(key)
                        .then(pushed)
                        .catch(function (err) {
                            return pushed(Promise.resolve());
                        })
                }))
            }
            return result(err ? Promise.reject(err) : Promise.resolve());
        })
    }

    async function DistinctFor(key) {
        if (!key) throw "Key Is Undefined";
        try {
            final[key] = await collection.distinct(key);
        } catch (e) {
            final[key] = 'failed';
            throw e;
        }
    }
}

সুতরাং মৌলিক _idসূচকের সাহায্যে সংগ্রহ অনুসন্ধান করে নিম্নলিখিতটি ফিরে আসবে (পরীক্ষার সংগ্রহের পরীক্ষার সময় কেবল একটি নথি থাকে):

Mongo.MongoClient.connect(url, function (err, client) {
    assert.equal(null, err);

    let collection = client.db('my db').collection('the targeted collection');

    GetFor(collection, '_id')
        .then(function () {
            //returns
            // { _id: [ 5ae901e77e322342de1fb701 ] }
        })
        .catch(function (err) {
            //manage your error..
        })
});

মনে মনে, এটি নোডজেএস ড্রাইভারের স্থানীয় পদ্ধতি ব্যবহার করে। কিছু অন্যান্য উত্তর যেমন পরামর্শ দিয়েছে, সেখানে অন্যান্য পদ্ধতির যেমন সামগ্রিক কাঠামো রয়েছে। আমি ব্যক্তিগতভাবে এই পদ্ধতিরটিকে আরও নমনীয় মনে করি, কারণ আপনি কীভাবে ফলাফলগুলি ফিরিয়ে আনতে পারেন তা সহজেই তৈরি এবং সূক্ষ্ম সুর করতে পারেন। স্পষ্টতই, এটি কেবল শীর্ষ স্তরের বৈশিষ্ট্যগুলিকে সম্বোধন করে, নেস্টেডগুলিকে নয়। এছাড়াও, গ্যারান্টিটি সহ যে সমস্ত নথির প্রতিনিধিত্ব রয়েছে সেখানে গৌণ সূচকগুলি থাকতে হবে (মূল _একটি ছাড়া অন্য), সেই সূচিগুলি হিসাবে সেট করা উচিত required


0

আমরা মঙ্গো জেএস ফাইল ব্যবহার করে এটি অর্জন করতে পারি। নীচে দেওয়া অনুসারে লিনাক্সের কনসোলে আপনার getCollectionName.js ফাইল এবং জেএস ফাইল চালান কোডের নীচে যুক্ত করুন:

মঙ্গো - হোস্ট 192.168.1.135 getClayName.js

db_set = connect("192.168.1.135:27017/database_set_name"); // for Local testing
// db_set.auth("username_of_db", "password_of_db"); // if required

db_set.getMongo().setSlaveOk();

var collectionArray = db_set.getCollectionNames();

collectionArray.forEach(function(collectionName){

    if ( collectionName == 'system.indexes' || collectionName == 'system.profile' || collectionName == 'system.users' ) {
        return;
    }

    print("\nCollection Name = "+collectionName);
    print("All Fields :\n");

    var arrayOfFieldNames = []; 
    var items = db_set[collectionName].find();
    // var items = db_set[collectionName].find().sort({'_id':-1}).limit(100); // if you want fast & scan only last 100 records of each collection
    while(items.hasNext()) {
        var item = items.next(); 
        for(var index in item) {
            arrayOfFieldNames[index] = index;
        }
    }
    for (var index in arrayOfFieldNames) {
        print(index);
    }

});

quit();

ধন্যবাদ @ackuser


0

@ জেমস ক্রপচোর উত্তর থেকে থ্রেড অনুসরণ করে, আমি নিম্নলিখিতটিতে পৌঁছলাম যা আমি ব্যবহার করতে খুব সহজ বলে মনে করেছি। এটি একটি বাইনারি সরঞ্জাম, যা আমি ঠিক যা খুঁজছিলাম: মঙ্গোয়ে ye

এই সরঞ্জামটি ব্যবহার করে আমার স্কিমাটি কমান্ড লাইন থেকে রফতানি করতে প্রায় 2 মিনিট সময় লেগেছে।


0

আমি জানি এই প্রশ্নটি 10 ​​বছরের পুরনো তবে কোনও সি # সমাধান নেই এবং এটি বের করতে আমাকে কয়েক ঘন্টা সময় লেগেছে। আমি .NET ড্রাইভার ব্যবহার করছি এবং System.Linqকীগুলির একটি তালিকা ফিরিয়ে আনতে।

var map = new BsonJavaScript("function() { for (var key in this) { emit(key, null); } }");
var reduce = new BsonJavaScript("function(key, stuff) { return null; }");
var options = new MapReduceOptions<BsonDocument, BsonDocument>();
var result = await collection.MapReduceAsync(map, reduce, options);
var list = result.ToEnumerable().Select(item => item["_id"].ToString());

-1

আমি কার্লোস এলএম এর সমাধানটি কিছুটা বাড়িয়ে দিয়েছি যাতে এটি আরও বিস্তারিত।

স্কিমার উদাহরণ:

var schema = {
    _id: 123,
    id: 12,
    t: 'title',
    p: 4.5,
    ls: [{
            l: 'lemma',
            p: {
                pp: 8.9
            }
        },
         {
            l: 'lemma2',
            p: {
               pp: 8.3
           }
        }
    ]
};

কনসোলে টাইপ করুন:

var schemafy = function(schema, i, limit) {
    var i = (typeof i !== 'undefined') ? i : 1;
    var limit = (typeof limit !== 'undefined') ? limit : false;
    var type = '';
    var array = false;

    for (key in schema) {
        type = typeof schema[key];
        array = (schema[key] instanceof Array) ? true : false;

        if (type === 'object') {
            print(Array(i).join('    ') + key+' <'+((array) ? 'array' : type)+'>:');
            schemafy(schema[key], i+1, array);
        } else {
            print(Array(i).join('    ') + key+' <'+type+'>');
        }

        if (limit) {
            break;
        }
    }
}

চালান:

schemafy(db.collection.findOne());

আউটপুট

_id <number>
id <number>
t <string>
p <number>
ls <object>:
    0 <object>:
    l <string>
    p <object>:
        pp <number> 

3
তার উত্তরটি ভুল এবং আপনি এটির উপরে তৈরি করেছিলেন। পুরো পয়েন্ট আউটপুট হয় সব ক্ষেত্র সব যা প্রতিটি পরের এক চেয়ে বিভিন্ন ক্ষেত্রে থাকতে পারে প্রথম দলিল দস্তাবেজ, না।
অস্যা কামস্কি

-3

আমার চারপাশে 1 টি সহজ কাজ আছে ...

আপনার প্রধান সংগ্রহ "জিনিস "গুলিতে ডেটা / ডকুমেন্ট সন্নিবেশ করার সময় আপনি যা করতে পারেন তা হ'ল 1 পৃথক সংগ্রহের মধ্যে আপনাকে অবশ্যই বৈশিষ্ট্যগুলি সন্নিবেশ করাতে হবে" things_attributes "বলতে দিন।

সুতরাং প্রতিবার আপনি "জিনিস" sertোকানোর সময়, আপনি "things_attributes" থেকে সেই নথির মানগুলি আপনার নতুন ডকুমেন্ট কীগুলির সাথে তুলনা করুন যদি কোনও নতুন কী সেই দস্তাবেজে এটি যুক্ত করে আবার এটি প্রবেশ করান।

সুতরাং জিনিস_প্রেমগুলিতে অনন্য কীগুলির কেবলমাত্র 1 টি নথি থাকবে যা আপনি যখনই প্রয়োজন সন্ধান করতে পারেন সন্ধানের জন্য () অনুসন্ধানের মাধ্যমে


অনেক এন্ট্রি সহ ডাটাবেসগুলিতে যেখানে সমস্ত কীগুলির জন্য অনুসন্ধানগুলি ঘন ঘন এবং সন্নিবেশগুলি বিরল হয়, "সমস্ত কীগুলি পান" ক্যোয়ারির ফলাফলটি ক্যাশে করা অর্থপূর্ণ হবে। এটি করার একটি উপায় এটি।
স্কট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.