2012-09-03 5 views
11

Comment dow je requête des commentaires plus ou inférieur à une certaine date ...requête Mongoose documents imbriqués plus ou moins une certaine date

Voici mon schéma avec le modèle Post et un modèle Commentaire:

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); 
    }); 

J'ai besoin d'aide pour interroger les documents intégrés ...

Ok J'ai modifié mon code pour donner plus de détails.

Ceci retourne un tableau vide. Donc ce que je veux ou ce à quoi je m'attendais, c'est un Post avec un tableau de commentaires vide. Mais avec cette requête je n'ai pas de message du tout. (quand j'échange $ gte avec $ lte je reçois (évidemment) le post avec ses 2 commentaires).

Mais encore une fois comment puis-je filtrer les détails selon ma description ci-dessus?

Répondre

19

Utilisez dot notation pour accéder à l'intérieur des documents de groupe intégrés. Par exemple, pour interroger les Post commentaires avec un created_at entre date1 et date2:

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

MISE À JOUR

Merci pour l'édition; Maintenant, je comprends que vous essayez de filtrer les commentaires d'un seul poste par leur created_at date. Vous ne pouvez pas le faire directement avec les requêtes MongoDB, mais je crois que vous pouvez le faire avec le framework d'agrégation 2.2 si vous utilisez cette version. Jetez un oeil à la discussion de ce feature request sur Jira pour des exemples.

+0

Merci, et comment le ferais-je pour 1 Post {_id: 1, "comments.created_a": {$ lt: (new Date())} ...? – silverfighter

+0

À droite, vous ajoutez simplement la propriété '_id: 1' à votre objet sélecteur. – JohnnyHK

+0

Fonctionne pas comme prévu. J'ai édité le q. pour donner plus de détails ... – silverfighter

Questions connexes