MongoDb запрашивает встроенную коллекцию с фильтрацией / упорядочением - PullRequest
1 голос
/ 31 августа 2011

Представим себе обычный блог-движок (просто для примера). Модель будет состоять из коллекции сообщений со встроенными комментариями «коллекция».

Теперь мне нужно получить только 10 последних комментариев вместе с моими данными Post.

  1. Какой лучший способ сделать это?
  2. Это ценная оптимизация? (кроме сокращения сетевого трафика)

P.S. Я использую официальный C # драйвер + свободное владение, но я могу отказаться от linq по уважительной причине.

Ответы [ 2 ]

2 голосов
/ 06 сентября 2011

Не могли бы вы использовать команду Slice для получения подмножества массива (последние 10)? Что-то вроде:

db.posts.find({}, {comments:{$slice: -10}})

Я нашел это в официальной документации, когда мне нужно было сделать что-то подобное.

Ссылка: http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements

Самый простой способ использования команды slice с C #:

var your_query; 
var slice = Fields.Slice("comments", -10); 
var cursor = collection.Find(your_query).SetFields(slice); 
foreach (var document in cursor) { 
    ...
} 
0 голосов
/ 31 августа 2011

Почему бы не использовать выделенную коллекцию самых последних комментариев? Вам нужно будет выполнить две вставки, когда комментарий будет опубликован, но получить самые последние комментарии просто. Как правило, вы получаете их гораздо чаще, чем новый комментарий в любом случае.

Как отметил Стив Б., это, как правило, «представление» в том смысле, что эта коллекция может содержать информацию, немного отличающуюся от комментариев в коллекции сообщений. Например, вы можете сохранить идентификатор сообщения и имя сообщения в каждом комментарии, чтобы вы могли отобразить соответствующую ссылку.

Вы можете использовать ограниченную коллекцию , скажем, 100 элементов, которая автоматически отбрасывает старые комментарии (т. Е. Реализует FIFO)

...