#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. Превосходно .. продолжайте улучшать его