首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongoose通过引用属性查找文档

mongoose通过引用属性查找文档
EN

Stack Overflow用户
提问于 2016-03-24 21:45:36
回答 1查看 23.1K关注 0票数 15

我有第一个模特儿:

代码语言:javascript
复制
var personSchema    = new Schema({
    firstname: String,
    name: String
});
module.exports = mongoose.model('Person', personSchema);

第二对模范情侣:

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

我发现一对情侣和一个人ObjectId:

代码语言:javascript
复制
    Couple.find({
        'person1': req.params.objectid
    })
    .populate({
        path: 'person1 person2'
    })
    .exec(function (err, couple) {
        if (err)
            res.send(err);
        res.json(couple)
    });

但我想通过给出名字而不是一个人的ObjectId来找到一对情侣,类似这样:

代码语言:javascript
复制
    Couple.find({
        'person1.firstname': "Bob"
    })
    .populate({
        path: 'person1 person2'
    })
    .exec(function (err, couple) {
        if (err)
            res.send(err);
        res.json(couple)
    });

但它总是空的..。

怎么解决这个问题呢?

感谢您的反馈。

编辑

我只是实现了答案:

现在让我们看看我的情侣模型:

代码语言:javascript
复制
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);

使用这种用法:

代码语言:javascript
复制
Couple.findByUsername(req.params.username, function (err, couple) {
        if(err)
            res.send(err);
        res.json(couple);
    });

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-24 22:06:54

在您的couple模型中,person1是一个ObjectID (我知道您知道这一点),因此它没有明显的属性.firstname

实际上,实现这一点的最好方法是根据用户的名字找到该用户,然后使用该用户的id查询这对夫妇。

此方法可以/应该作为静态方法存在于couple模型中(简化的代码示例):

代码语言:javascript
复制
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
}

只有like this exemple

编辑:还要注意引用必须是_id (所以你不能用名字存储,这无论如何都不是一个好主意)。

考虑到您的编辑:

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

代码语言:javascript
复制
{person1: mongoose.Types.ObjectId(Person._id)}

另外,您的变量是person而不是Person。尝试登录person,看看是否收到了什么信息。

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36201689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档