使用mongoose返回特定用户的所有注释,而不包含其他文档字段

时间:2012-11-07 16:10:13

标签: javascript mongodb indexing mongoose

var mongoose = require('mongoose');

// defines the database schema for this object
var schema = mongoose.Schema({
  projectName : String,
  authorName : String

   comment : [{
      id : String,                                  
      authorName : String,
      authorEmailAddress : { type : String, index : true }  
    }]
  });

})

// Sets the schema for model
var ProjectModel = mongoose.model('Project', schema);

// Create a project
exports.create = function (projectJSON) {

  var project = new ProjectModel({

    projectName : projectJSON.projectName ,
    authorName : projectJSON.authorName,    

    comment : [{
      id : projectJSON.comments.id,                                         
      authorName : projectJSON.comments.authorName,                         
      authorEmailAddress : projectJSON.authorEmailAddress
    });

  project.save(function(err) {
    if (err) {
      console.log(err);
    }
    else{
      console.log("success");
    }
  });


}

问:我想检索所有项目中特定用户的所有评论(没有其他文档字段)

我的尝试:

// assuming email address is unique per user, as user can always change displayName for instance

exports.allCommentsByUser = function(userEmail, callback){ 
    ProjectModel.find(
        {"comments.authorEmailAddress" : userEmail}, 
        { "projectName" : 1, "comments.authorEmailAddress" : 1 }, 
        callback);
};

1 个答案:

答案 0 :(得分:1)

您可以将2.2聚合框架用于此类查询:

ProjectModel.aggregate([
    {
        // Only include the projectName and comments fields.
        $project: { 'projectName': true, 'comments': true, '_id': false }
    }, {
        // Get all project docs that contain comments by this user
        $match: { 'comments.authorEmailAddress': userEmail }
    }, {
        // Duplicate the project docs, one per comment.
        $unwind: '$comments'
    }, {
        // Filter that result to just the comments by this user
        $match: { 'comments.authorEmailAddress': userEmail }
    }], callback
);