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
看看你是否得到了一些东西。
最后,我的代码示例非常简单,不要忘记处理错误和所有(请参阅上面给出的链接,这是完整的)。