উত্তর:
আপনি মানচিত্রের সাহায্যে এটি করতে পারেন:
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", ...]
for (var key in this.first_level.second_level.nth_level) { emit(key, null); }
db.runCommand({..., out: { "inline" : 1 }}).results.map(function(i) { return i._id; });
সঙ্গে ক্রিস্টিনা এর উত্তর : অনুপ্রেরণা, আমি বিভিন্নতা নামক একটি ওপেন সোর্স টুল যা ঠিক এই আছে নির্মিত https://github.com/variety/variety
আপনি নতুন সঙ্গে অ্যাগ্রিগেশন ব্যবহার করতে পারেন $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"}}
])
.next()["allkeys"]
কমান্ডটিতে সংযোজন করতে পারেন (ধরে নিলে সংগ্রহের কমপক্ষে একটি উপাদান রয়েছে)।
এটা চেষ্টা কর:
doc=db.thinks.findOne();
for (key in doc) print(key);
যদি আপনার লক্ষ্য সংগ্রহ খুব বেশি না হয় তবে আপনি এটি মঙ্গো শেল ক্লায়েন্টের অধীনে চেষ্টা করতে পারেন:
var allKeys = {};
db.YOURCOLLECTION.find().forEach(function(doc){Object.keys(doc).forEach(function(key){allKeys[key]=1})});
allKeys;
পাইমোঙ্গো ব্যবহার করে একটি পরিষ্কার এবং পুনরায় ব্যবহারযোগ্য সমাধান:
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', ... ]
if (typeof(this[key]) == 'number')
আগে উদাহরণ যোগ করুন emit(key, null)
।
পাইথন ব্যবহার করা। সংগ্রহের সমস্ত শীর্ষ-স্তরের কীগুলির সেটটি ফেরত দেয়:
#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()
)
পাইথনে কাজ করা নমুনাটি এখানে: এই নমুনা ফলাফলগুলিকে ইনলাইন দেয়।
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']
আপনি যদি মঙ্গোদব ৩.৪.৪ এবং তার বেশি ব্যবহার করে থাকেন তবে আপনি নীচে সমষ্টি ব্যবহার করে $objectToArray
এবং $group
সমষ্টিটি ব্যবহার করতে পারেন
db.collection.aggregate([
{ "$project": {
"data": { "$objectToArray": "$$ROOT" }
}},
{ "$project": { "data": "$data.k" }},
{ "$unwind": "$data" },
{ "$group": {
"_id": null,
"keys": { "$addToSet": "$data" }
}}
])
এখানে কাজের উদাহরণ
$match
একত্রিতকরণ পাইপলাইনটির শুরুতে কেবলমাত্র শর্তের সাথে মেলে এমন নথির কীগুলি পেতে ব্যবহার করতে পারেন ।
আমি অবাক হচ্ছি, এখানে কারও কাছেই সদৃশ javascript
ও Set
লজিক ব্যবহার করে সদৃশ মানগুলি স্বয়ংক্রিয়ভাবে ফিল্টার করতে উত্তর নেই , মঙ্গো শেলের উপর নীচের মতো সাধারণ উদাহরণ :
var allKeys = new Set()
db.collectionName.find().forEach( function (o) {for (key in o ) allKeys.add(key)})
for(let key of allKeys) print(key)
এটি সংগ্রহের নামে সমস্ত সম্ভাব্য অনন্য কী মুদ্রণ করবে : সংগ্রহের নাম ।
আমি মনে করি যে এখানে সর্বোপরি উল্লিখিত হিসাবে এটি করার সর্বোত্তম উপায়টি মঙ্গড ৩.৪.৪++ তে রয়েছে তবে $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
এটিকে এড়াতে পারি > .. একই কাজটি করা উচিত, আগে এই উত্তরটি দেখে নেওয়া উচিত ছিল, আমার জীবন সেই উপায়ে আরও সহজ হত ( -_-)
সম্ভবত সামান্য অফ-টপিক, তবে আপনি কোনও বস্তুর সমস্ত কী / ক্ষেত্র পুনরাবৃত্তভাবে সুন্দর-মুদ্রণ করতে পারেন:
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)
}
যখন সংগ্রহের সমস্ত বস্তুর কাঠামোগত একই থাকে তখন কার্যকর।
সমস্ত কী বিয়োগের একটি তালিকা পেতে _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"];
আমি নোডেজে লেখার চেষ্টা করছিলাম এবং অবশেষে এটি নিয়ে এসেছি:
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;
});
মঙ্গোলডব ডকুমেন্টেশন অনুসারে , এর সংমিশ্রণ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
।
আমরা মঙ্গো জেএস ফাইল ব্যবহার করে এটি অর্জন করতে পারি। নীচে দেওয়া অনুসারে লিনাক্সের কনসোলে আপনার 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
@ জেমস ক্রপচোর উত্তর থেকে থ্রেড অনুসরণ করে, আমি নিম্নলিখিতটিতে পৌঁছলাম যা আমি ব্যবহার করতে খুব সহজ বলে মনে করেছি। এটি একটি বাইনারি সরঞ্জাম, যা আমি ঠিক যা খুঁজছিলাম: মঙ্গোয়ে ye ।
এই সরঞ্জামটি ব্যবহার করে আমার স্কিমাটি কমান্ড লাইন থেকে রফতানি করতে প্রায় 2 মিনিট সময় লেগেছে।
আমি জানি এই প্রশ্নটি 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());
আমি কার্লোস এলএম এর সমাধানটি কিছুটা বাড়িয়ে দিয়েছি যাতে এটি আরও বিস্তারিত।
স্কিমার উদাহরণ:
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>
আমার চারপাশে 1 টি সহজ কাজ আছে ...
আপনার প্রধান সংগ্রহ "জিনিস "গুলিতে ডেটা / ডকুমেন্ট সন্নিবেশ করার সময় আপনি যা করতে পারেন তা হ'ল 1 পৃথক সংগ্রহের মধ্যে আপনাকে অবশ্যই বৈশিষ্ট্যগুলি সন্নিবেশ করাতে হবে" things_attributes "বলতে দিন।
সুতরাং প্রতিবার আপনি "জিনিস" sertোকানোর সময়, আপনি "things_attributes" থেকে সেই নথির মানগুলি আপনার নতুন ডকুমেন্ট কীগুলির সাথে তুলনা করুন যদি কোনও নতুন কী সেই দস্তাবেজে এটি যুক্ত করে আবার এটি প্রবেশ করান।
সুতরাং জিনিস_প্রেমগুলিতে অনন্য কীগুলির কেবলমাত্র 1 টি নথি থাকবে যা আপনি যখনই প্রয়োজন সন্ধান করতে পারেন সন্ধানের জন্য () অনুসন্ধানের মাধ্যমে