mongodb C # использует поиск и фасет для подсчета

#c# #mongodb #count

#c# #mongodb #подсчет

Вопрос:

У меня есть этот код:

 var pipeline = new BsonDocument[]
            {
            new BsonDocument("$lookup",
            new BsonDocument
                {
                    { "from", "comments" },
                    { "let",
            new BsonDocument("id", "$_id") },
                { "pipeline",
            new BsonArray
                    {
                        new BsonDocument("$match",
                        new BsonDocument("$expr",
                        new BsonDocument("$eq",
                        new BsonArray
                                    {
                                        "$postId",
                                        "$$id"
                                    }))),
                        new BsonDocument("$sort", new BsonDocument("time", -1)),
                        new BsonDocument("$limit", Filters.defaultCommentsLimitPerPost),
                    }
                },
                    { "as", "comments" }
                }),
            new BsonDocument("$limit", 3),
            new BsonDocument("$skip", page - 1),
            };

var pipeline = PipelineDefinition<Post, Post>.Create(Filters.GetJoinComments(page));
                var result = await collectionPosts.Aggregate(pipeline).ToListAsync();
            
 

Как я могу также получить общее количество всех документов, игнорируя $limit и $ skip?

пример для документа post:

 {"_id":null,"time":{"$numberLong":"637396703347196085"},"text":"some text","totalCommentsCount":{"$numberInt":"0"},"likes":{"$numberInt":"0"},"category":{"$numberInt":"0"},"videoUrl":null}
 

пример документа с комментариями:

 {"_id":{"$oid":"5f9dbaf79d10c42f64f46f53"},"text":"a comment","time":{"$numberLong":"637397765330317024"},"likes":{"$numberInt":"0"},"postId":{"$oid":"5f9089dd818de4309403d21b"}}
 

Комментарии:

1. Внутри конвейера вы можете использовать group для поиска всех записей, а затем развернуть его. иначе вы можете использовать фасет для этого. Если вы не понимаете, пожалуйста, опубликуйте свои примеры данных

2. Не уверен, куда поместить фасет и каков его синтаксис. У меня есть документы «post» и документы «comment». документ «комментарий» имеет поле «Почтовый идентификатор». Итак, вы можете видеть в $lookup, что я присоединяю postID комментария к _id записи, затем сортирую комментарии по времени и ограничению для X комментариев. Позже я ограничиваю и пропускаю посты. Чего я хочу, так это знать общее количество сообщений.

3. Почему бы вам не опубликовать образцы обеих коллекций, не объясняя этого. Это было бы лучше и для других

4. @varman Я отредактировал вопрос и добавил примеры.

Ответ №1:

Запрос, который вы попробовали, очень ценится.

Я дополнительно добавил

  • $sort для osrt по _id. Если вам не нужно, удалите сортировку
  • $group чтобы сгруппировать все документы в data (Потому _id:null что). В то же время мы получаем общее количество.
  • $unwind для деконструкции data массива
  • Я думаю, вы используете это для разбивки на страницы, верно? Если это так, вам нужно сохранить $sort и сначала должно быть $skip , следующее должно быть $limit таким, как я упоминал

И рабочий запрос.

 db.post.aggregate([
  {
    $lookup: {
      from: "comment",
      let: {
        "pId": "$_id"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$postId",
                "$$pId"
              ]
            }
          }
        }
      ],
      as: "comments"
    }
  },
  {
    $sort: { _id: 1 }
  },
  {
    $group: {
      _id: null,
      data: { $push: "$$ROOT" },
      totalRecords: { $sum: 1 }
    }
  },
  { $unwind: "$data" },
  { $skip: 1 },
  { $limit: 1 }
])
 

Рабочая игровая площадка Mongo

Комментарии:

1. Вы знаете, как я должен перевести $group в c # aggregation builders? Я попробовал что-то вроде «new BsonDocument(«$group», new BsonDocument({{«_id», «, …». Не лучше ли использовать $facet? И вы также не ограничиваете количество комментариев, я думаю, это просто добавить $sort и $limit в конвейер.

2. @RonyTesler Поможет ли вам ответ

3. Извините, я не мог его использовать. Не уверен, как написать это в BsonDocument[] , и я думаю, что $facet — правильный выбор здесь.

4. Превосходно .. продолжайте улучшать его