另一个MongoDB中的一个查询挂起

时间:2016-07-14 23:23:05

标签: node.js mongodb mongoose

我试图只获得会议[来自会议集合]的Notes [来自笔记集合],其中不包含“test”一词:

function getNotes(done) {
  noteSchema.find({}).exec((err, notes) => {
    var numNotes = 0;
    async.each(notes, (n, next) => {
                userSchema.findById(n.userId, (err, user) => {
                if (err || !user) { next(); return; }
                var emailsStr = utils.getEmailsString(user.emails);
                if (!utils.toSkipEmail(emailsStr)) {
                    meetingSchema.findById(n.meetingId, (err, meeting)  => {
                    if (err || !meeting) { next(); return; }
                        if (meeting.name.displayValue.indexOf('test', 'Test') == -1) {
                            numNotes++;
                }
              next();
              });
            }
          })
    }, (err, result) => {
      console.log(util.format('Total Number of Notes: %d', numNotes));
      done(null);
    });
  });
}

代码工作正常,无需添加行以按ID查找会议。它挂起就在那一点。

作为参考,这是一个函数的开头,后来过滤掉包含会议的任何“测试”或“测试”。

function getMeetings(done) {
  meetingSchema.find({
    'name.displayValue': { '$regex' : '(?!.*test)^.*$' , '$options' : 'i' }
  }).exec((err, meetings) => {

Notes Schema的相关行:

var mongoose = require('mongoose');

var Schema = mongoose.Schema;

var noteSchema = mongoose.Schema({
    meetingId: {type: String, default: ''},
});

exports.Note = mongoose.model('Note', noteSchema);

会议架构没有备注字段。

1 个答案:

答案 0 :(得分:0)

所以,如果我要去寻找这样的解决方案,我希望得到所有不属于会议的笔记,并在名称中加上'test'这个词,我可能会去另一个除此之外,除非有大量的笔记,你可以获得所有笔记并用他们的会议填充它们,然后进行过滤。假设您的NoteSchema定义了类似的内容:

meeting : { type: ObjectId, ref: 'Meeting'} 

然后在你的查询中你可以做(​​给定notATest函数适当地返回true或false:

Note.find({}).populate('meeting').exec((e, n) => {
  _.omit(n, (note) => { return notATest(note.meeting.name); });
});

或者,您可以首先搜索所有非测试会议,并在其上调用.populate('notes'),如果'ref'采用其他方式。