Запрос MongoDB для получения суммы длины всех полей массива документа - PullRequest
0 голосов
/ 18 июня 2020

Ниже приведен образец документа коллекции, скажем «CollectionA»

{
    "_id" : ObjectId("5ec3f19225701c4f7ab11a5f"),
    "workshop" : ObjectId("5ebd37a3d33055331eb4730f"),
    "participant" : ObjectId("5ebd382dd33055331eb47310"),
    "status" : "analyzed",
    "createdBy" : ObjectId("5eb7aa24d33055331eb4728c"),
    "updatedBy" : ObjectId("5eb7aa24d33055331eb4728c"),
    "results" : [ 
        {
            "analyze_by" : {
                "user_name" : "m",
                "user_id" : "5eb7aa24d33055331eb4728c"
            },
            "category_list" : [ 
                "Communication", 
                "Controlling", 
                "Leading", 
                "Organizing", 
                "Planning", 
                "Staffing"
            ],
            "analyzed_date" : ISODate("2020-05-19T14:48:49.993Z"),
        }
    ],
    "summary" : [],
    "isDeleted" : false,
    "isActive" : true,
    "updatedDate" : ISODate("2020-05-19T14:48:50.827Z"),
    "createdDate" : ISODate("2020-05-19T14:47:46.374Z"),
    "__v" : 0
}

Мне нужно запросить все документы, чтобы получить длину массива «результатов» и вернуть сумму всех «результатов» документа длина.

Например,

документ 1 имеет длину «результатов» - 5

документ 2 имеет длину «результатов» - 6

, тогда вывод должен быть 11.

Можем ли мы написать запрос вместо получения всего, повторения и добавления длины результатов ??

Ответы [ 3 ]

1 голос
/ 18 июня 2020

Если бы я четко понял, вы хотели бы спроецировать длину атрибута результата. Поэтому вам следует проверить, подойдет ли вам оператор $ size. https://docs.mongodb.com/manual/reference/operator/aggregation/size/

0 голосов
/ 18 июня 2020

Вы используете запрос группировки агрегации с операторами агрегации $sum и $size, чтобы получить общую сумму размеров элементов массива для всех документов в коллекции.

db.collection.aggregate( [
  { 
       $group: { 
           _id: null, 
           total_count: { $sum: { $size: "$results" } }
       } 
  }
] )


Агрегация с использованием Mon goose s Model.aggregate():
SomeModel.aggregate([
  { 
       $group: { 
           _id: null, 
           total_count: { $sum: { $size: "$results" } }
       } 
  }
]).
then(function (result) {
  console.log(result);
});
0 голосов
/ 18 июня 2020

Вы можете использовать $group и $sum для вычисления общего размера поля, содержащего размер вашего массива результатов. Чтобы создать поле, вы можете использовать $size в $addFields, чтобы вычислить размер результатов в каждом документе и поместить его в поле. Как показано ниже:

db.getCollection('your_collection').aggregate([
{
      $addFields: {
         result_length: { $size: "$results"}
      }
   },
   {
   $group: {
        _id: '',
        total_result_length: { $sum: '$result_length' }
    }
    }

])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...