How to view document fields in mongo shell?
Is there a way to figure out the fields/keys in a document while in mongo's shell? As an example, let's say we have a docume开发者_JS百科nt like (pseudocode):
{
"message": "Hello, world",
"from": "hal",
"field": 123
}
I'd like to run a command in the shell that returns the list of fields/keys in that document. For instance, something like this:
> var message = db.messages.findOne()
> message.keys()
... prints out "message, from, field"
Even easier:
Object.keys(db.messages.findOne())
A for ... in
loop should do the trick:
> var message = db.messages.findOne();
> for (var key in message) {
... print(key);
... }
Other answers are correct.
However, as I am completely new, I didn't understand where & how the above commands need to be executed.
Below helped, from my github.
On Windows: Run this code in a command prompt (cmd).
On Mac or Linux: Run this code in a terminal window.
// ------------
// start mongo client
mongo
// ------------
// list all databases
show dbs
// NOTE: assume one of the databases is myNewDatabase
// use the 'myNewDatabase' database
use myNewDatabase
// ------------
// show all collections of 'myNewDatabase' database
show collections
// NOTE: assume one of the collections is 'myCollection'
// show all documents of 'myCollection' collection
db.myCollection.find()
// ------------
// field keys
Object.keys(db.myCollection.findOne());
// values
db.myCollection.find().forEach(function(doc) {
for (field in doc) {
print(doc[field]);
}
});
// ------------
To get a list of all fields used in a collection in MongoDB, this is the way I found most straightforward (your mileage may vary :) ):
Create a .js file with the content:
use yourdbname
mr = db.runCommand({
"mapreduce" : "collectionName",
"map" : function() {
for (var key in this) { emit(key, null); }
},
"reduce" : function(key, stuff) { return null; },
"out": "collectionName" + "_keys"
})
db[mr.result].distinct("_id")
I found out how to do this here (GeoffTech blog)
I ran it from the shell to print the output in the console
mongo < nameOfYourFile.js
or dump the output in a text file:
mongo < nameOfYourFile.js > outputDir\nameOfYourOutputFile.txt
I'm totally new to MongoDb so I hope it does indeed get all fields regardless of use throughout the documents!
(I'm using MongoDb on windows 10, so my console may differ from yours)
You can do this in a way that gets all the fields even if not every document in the collection has some of them, and without creating a collection:
return db.collectionName.aggregate( [
{ $project : { x : { $objectToArray : "$$ROOT" } } },
{ $unwind : "$x" },
{ $group : { _id : null, keys : { $addToSet : "$x.k" } } },
] ).toArray()[0].keys.sort();
This is also a handy thing to add to the Mongo shell, which you can do by including it your .mongorc.js
file in your home directory:
Object.assign( DBCollection.prototype, {
getAllFieldNames() {
return db[ this._shortName ].aggregate( [
{ $project : { x : { $objectToArray : "$$ROOT" } } },
{ $unwind : "$x" },
{ $group : { _id : null, keys : { $addToSet : "$x.k" } } },
] ).toArray()[0].keys.sort();
},
} );
Then you can just do db.myCollection.getAllFieldNames()
when using the shell..
var task = db.task.find().next()
for (let key in task){print(key)}
精彩评论