MongoDB: как подсчитать количество ключей в документе?

Допустим, что документ:

{

a: 1,
b: 1,
c: 2,
 ....
z: 2
}

Как я могу подсчитать количество ключей в таком документе?

Спасибо

Ответы

Ответ 1

Для этого нет встроенной команды. Выполните этот документ и сами подсчитайте ключи.

Ответ 2

В Mongo (как и в большинстве решений NoSQL) обычно рекомендуется предварительно вычислить такие значения, если вы хотите сделать их позже (например, "где количество разных ключей > 12" ), поэтому, возможно, вам стоит подумать добавив новое поле "keyCount", которое вы увеличиваете каждый раз при добавлении нового ключа.

Ответ 3

Вполне возможно, если использовать MongoDB 3.6 и новее, хотя структура агрегации. Используйте оператор $objectToArray в конвейере агрегации, чтобы преобразовать документ в массив. Возвращаемый массив содержит элемент для каждой пары поле/значение в исходном документе. Каждый элемент в массиве возврата представляет собой документ, который содержит два поля k и v.

Ссылка на корневой документ становится возможной через системную переменную $$ROOT, которая ссылается на документ верхнего уровня, который в настоящее время обрабатывается на стадии конвейера агрегации.

Получив массив, вы можете использовать использование шага конвейера $addFields, чтобы создать поле, которое содержит счетчики, а фактический счетчик получается с использованием $size оператор.

Все это можно сделать в одном конвейере, вложив выражения следующим образом:

db.collection.aggregate([
    {
        "$addFields": {
            "count": {
                "$size": { 
                    "$objectToArray": "$$ROOT"
                }
            }
        }
    }     
])

Пример вывода

{
    "_id" : ObjectId("5a7cd94520a31e44e0e7e282"),
    "a" : 1.0,
    "b" : 1.0,
    "c" : 2.0,
    "z" : 2.0,
    "count" : 5
}

Чтобы исключить поле _id, вы можете использовать оператор $filter как:

db.collection.aggregate([
    {
        "$addFields": {
            "count": {
                "$size": { 
                    "$filter": {
                        "input": { "$objectToArray": "$$ROOT" },
                        "as": "el",
                        "cond": { "$ne": [ "$$el.k", "_id" ] }
                    }
                }
            }
        }
    }     
])

Ответ 4

Если вы находитесь на консоли Mongo, вы можете написать javascript для этого.

doc = db.coll.findOne({}); nKeys =0; for( k in doc){nKeys ++;} print(nKeys);

Это все равно будет считаться "вне монго".

Ответ 5

Серджио прав, вы должны сделать это за пределами манго.

Вы можете сделать что-то вроде этого:

var count = 0;
for(k in obj) {count++;}
print(count);

Ответ 6

const MongoClient = new require("mongodb").MongoClient(
  "mongodb://localhost:27017",
  {
    useNewUrlParser: true,
    useUnifiedTopology: true
  }
);
(async () => {
  const connection = await MongoClient.connect();
  const dbStuff = await connection
    .db("db")
    .collection("weedmaps.com/brands")
    .find({})
    .toArray();  // <- Chuck all it into an Array
  for (let thing of dbStuff) {
    console.log(Object.keys(thing).length);
  }
  return await connection.close();
})();