2012-09-03 12 views
11

Jak dow kwerendy komentarze większa lub mniejsza od określonej daty ...Mongoose zapytania zagnieżdżone dokumenty większa lub mniejsza pewna data

Oto mój schemat z modelu post i komentarz modelu

var mongoose = require('mongoose'); 
var should = require('should'); 

mongoose.connect("localhost","test_db"); 

var CommentSchema = new mongoose.Schema({ 
    content: {type:String}, 
    created_at: {type:Date, default:Date.now} 

}); 

var PostSchema = new mongoose.Schema({ 
    title: {type:String}, 
    content: {type:String}, 
    comments: [CommentSchema] 

    }); 

var Post = mongoose.model('Post',PostSchema); 
var Comment = mongoose.model('Comment',CommentSchema); 

var post = new Post({title:"hello world",comments:[{content:"1st comment"},{content:"2nd comment"}]}); 
// I saved it! and then I query for it 

    var id = "5045d5be48af9f040f000002"; 
    Post.find({ _id:id, 
       "comments.created_at":{ $gte:(new Date())} 
       },function(err,result){ 
    console.log(result); 
    }); 

Potrzebuję pomocy z zapytaniami dotyczącymi wbudowanych dokumentów ...

OK Edytowałem mój kod, aby podać więcej szczegółów.

To zwraca pustą tablicę. Tak, czego chcę lub czego bym oczekiwał to Post z pustą tablicą komentarzy. Ale z tym zapytaniem wcale nie otrzymuję postu. (Kiedy wymieniam $ gte z $ lte otrzymuję (oczywiście) post z jego 2 komentarzami).

Ale jak mogę odfiltrować szczegóły zgodnie z powyższym opisem?

Odpowiedz

19

Użyj numeru dot notation, aby uzyskać dostęp do wbudowanych dokumentów tablic. Na przykład, aby zapytać o komentarzach Post z created_at między date1 i date2:

Post.find({ "comments.created_at": { $gt: date1, $lt: date2 }}, function (err, docs) { 
    ... 
}); 

UPDATE

Dzięki za edycji; teraz rozumiem, że próbujesz filtrować komentarze pojedynczego wpisu według ich daty created_at. Nie możesz tego zrobić bezpośrednio z zapytaniami MongoDB, ale wierzę, że możesz to zrobić za pomocą struktury agregacji 2.2, jeśli jesteś w tej wersji. Spójrz na omówienie tego feature request na Jira dla przykładów.

+0

fajne dzięki, i jak bym to zrobił za 1 post {_id: 1, "comments.created_a": {$ lt: (new Date())} ...? – silverfighter

+0

W prawo, wystarczy dodać właściwość '_id: 1' do obiektu selektora. – JohnnyHK

+0

Działa niezgodnie z oczekiwaniami. Edytowałem q. aby podać więcej szczegółów ... – silverfighter

Powiązane problemy