2016-06-09 2 views
0

У меня есть большая коллекция под названием posts, например, так:Как только вернуть X количество встроенных документов с помощью MongoDB?

[{ 
    _id: 349348jf49rk, 
    user: frje93u45t, 
    comments: [{ 
     _id: fks9272ewt 
     user: 49wnf93hr9, 
     comment: "Hello world" 
    }, { 
     _id: j3924je93h 
     user: 49wnf93hr9, 
     comment: "Heya" 
    }, { 
     _id: 30283jt9dj 
     user: dje394ifjef, 
     comment: "Text" 
    }, { 
     _id: dkw9278467 
     user: fgsgrt245, 
     comment: "Hola" 
    }, { 
     _id: 4irt8ej4gt 
     user: 49wnf93hr9, 
     comment: "Test" 
    }] 
}] 

Мой comments поддокумент иногда может быть 100s документов долго. Мой вопрос в том, как я могу вернуть только 3 новейших документа (на основе идентификатора) вместо всех документов и вернуть длину всех документов как totalNumberOfComments в качестве числа вместо этого? Мне нужно сделать это за 100 секунд от posts. Это то, что конечный результат будет выглядеть так:

[{ 
    _id: 349348jf49rk, 
    user: frje93u45t, 
    totalNumberOfComments: 5, 
    comments: [{ 
     _id: fks9272ewt 
     user: 49wnf93hr9, 
     comment: "Hello world" 
    }, { 
     _id: j3924je93h 
     user: 49wnf93hr9, 
     comment: "Heya" 
    }, { 
     _id: 30283jt9dj 
     user: dje394ifjef, 
     comment: "Text" 
    }] 
}] 

Я понимаю, что это может быть завершена после того, как MongoDB возвращает данные от сплайсинга, хотя я думаю, что было бы лучше сделать это в запросе, так что Монго Безразлично» t должен возвращать все comments за каждые post все время.

ответ

1

Это решение проблемы? попробуйте подключить значения _id и посмотреть, что вам не хватает, и разместите их здесь.

начинается с этим запросом

db.collection.aggregate([{$match: {_id: 349348jf49rk}}, 
         {$project:{ 
            _id:1, 
            user:1, 
            totalNumberOfComments: { $size: "$comments" }, 
            comments: {$slice:3} 
           } 
         } 
        ]) 
+0

Совершенных. Просто пришлось изменить '$ slice' как' $ slice: ["$ comments", 3] ', так как' $ slice' внутри 'aggregate' требует двух аргументов. Кроме этого, все хорошо! Спасибо JBone. – Fizzix

Смежные вопросы