mongoose通过参考财产find一份文件

我有第一个模特人物:

var personSchema = new Schema({ firstname: String, name: String }); module.exports = mongoose.model('Person', personSchema); 

和第二个模型夫妇:

 var coupleSchema = new Schema({ person1: [{ type: Schema.Types.ObjectId, ref: 'Person' }], person2: [{ type: Schema.Types.ObjectId, ref: 'Person' }] }); module.exports = mongoose.model('Couple', coupleSchema); 

我find一个人ObjectId的情侣:

  Couple.find({ 'person1': req.params.objectid }) .populate({ path: 'person1 person2' }) .exec(function (err, couple) { if (err) res.send(err); res.json(couple) }); 

但是我想通过给一个名字而不是一个Object的ObjectIdfind一对夫妇,就像这样:

  Couple.find({ 'person1.firstname': "Bob" }) .populate({ path: 'person1 person2' }) .exec(function (err, couple) { if (err) res.send(err); res.json(couple) }); 

但它总是空的…

无论如何要解决这个问题?

感谢您的任何反馈。

编辑

我刚刚实现了答案:

现在我们来看看我的Couple模型:

 var Person = require('mongoose').model('Person'); var coupleSchema = new Schema({ person1 : [{ type: Schema.Types.ObjectId, ref: 'Person' }], person2 : [{ type: Schema.Types.ObjectId, ref: 'Person' }] }); coupleSchema.statics.findByUsername = function (username, callback) { var query = this.findOne() Person.findOne({'firstname': username}, function (error, person) { query.where( {person1: person._id} ).exec(callback); }) return query } module.exports = mongoose.model('Couple', coupleSchema); 

有了这个用法:

 Couple.findByUsername(req.params.username, function (err, couple) { if(err) res.send(err); res.json(couple); }); 

这样可行! 感谢您的回答和编辑。

在你的couple模型中, person1是一个ObjectID(我知道你知道它),所以它没有明显的没有property.firstname。

其实最好的办法是通过名字find用户,然后用用户的id来查询这对情侣。

这种方法可以/应该作为静态方法(简化代码示例)在对couple模型中:

 couple.statics.findByPersonFirstname = function (firstname, callback) { var query = this.findOne() Person.findOne({firstname: firstname}, function (error, person) { query.where($or: [ {person1: person._id}, {person1: person._id} ]).exec(callback); }) return query } 

就像这个例子 。

编辑:另外请注意,参考必须是_id (所以你不能存储的名字,这将是一个坏主意)。

考虑到你的编辑:

Person._id也许是一个String ,引用是一个ObjectId ,如果是这样,请尝试:

 {person1: mongoose.Types.ObjectId(Person._id)} 

另外,你variables是person而不是Person 。 尝试loginperson看看你是否得到了一些东西。

最后,我的代码示例非常简单,不要忘记处理错误和所有(请参阅上面给出的链接,这是完整的)。