Как получить все ключи в коллекции Mongodb?

Я видел несколько решений, но они не являются точным моим решением. У меня есть БД с именем результаты и имя коллекции отмечается, как показано ниже:

db.marks.find();
{ "_id" : ObjectId("54f57522627af4bfdcf79764"), "name" : "John", "scroe1" : 23, "score2" : 21, "score5" : 12 }
{ "_id" : ObjectId("54f5761a627af4bfdcf79765"), "name" : "Mike", "scroe2" : 22, "score3" : 20, "score4" : 22 }
{ "_id" : ObjectId("559d0bc521cb2e056507c3e3"), "name" : "Bush", "score2" : 30 }

Я пробовал с

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

и я получил

_id
name
score1
score2
score5

Но я хочу, чтобы все ключи в коллекции, как показано ниже:

_id, name, score1, score2, score3, score4, score5

имя scroe1 оценка2 оценка3 здесь

2 ответа

Решение

findOne вернет только первый найденный документ. Так как первый список, который вы перечисляете, не имеет ключей Score3 и Score4, он не будет отображать их. Если вы хотите показать все ключи корневого уровня во всех документах, вам нужно будет выполнить итерацию по всем документам в БД.

var keys = [];
db.marks.find().forEach(function(doc){
    for (var key in doc){ 
        if(keys.indexOf(key) < 0){
           keys.push(key);
        }
    }
});

print(keys);
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", ...]

MongoDB find() Команда имеет два аргумента: первый - запрос, второй - проекция.

Что-то вроде db.collection.find(query,projection),

если документ db.myCol.find();затем возвращается:

{
  {
    _id:1
    name: ''hello',
    age: 23
  }, {
    _id:2
    name: ''bollo',
    age: 27
  }
}

А также db.myCol.find({},{_id:1}); возвращает:

1
2
Другие вопросы по тегам