Ответ 1
Для этого нет встроенной команды. Выполните этот документ и сами подсчитайте ключи.
Допустим, что документ:
{
a: 1,
b: 1,
c: 2,
....
z: 2
}
Как я могу подсчитать количество ключей в таком документе?
Спасибо
Для этого нет встроенной команды. Выполните этот документ и сами подсчитайте ключи.
В Mongo (как и в большинстве решений NoSQL) обычно рекомендуется предварительно вычислить такие значения, если вы хотите сделать их позже (например, "где количество разных ключей > 12" ), поэтому, возможно, вам стоит подумать добавив новое поле "keyCount", которое вы увеличиваете каждый раз при добавлении нового ключа.
Вполне возможно, если использовать 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" ] }
}
}
}
}
}
])
Если вы находитесь на консоли Mongo, вы можете написать javascript для этого.
doc = db.coll.findOne({}); nKeys =0; for( k in doc){nKeys ++;} print(nKeys);
Это все равно будет считаться "вне монго".
Серджио прав, вы должны сделать это за пределами манго.
Вы можете сделать что-то вроде этого:
var count = 0;
for(k in obj) {count++;}
print(count);
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();
})();