我有第一个模特儿:

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);

我发现一对夫妇和一个人反对:

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

但我想通过给一个人起名字而不是对象来找到一对夫妇,比如:

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

但它总是空的...

要解决这个问题吗?

感谢您的反馈.

EDIT

我刚刚实现了答案:

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

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(我知道您知道它),所以它没有明显的属性.firstname.

实际上,实现这一点的最佳方法是,根据用户的名字找到该用户,然后用该用户的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
}

只有like this exemple.

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

考虑到你的编辑:

Person._id可能是String,参考是ObjectId,如果是,请try :

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

此外,变量是person,而不是Person.试着记录person,看看你是否得到了什么.

最后,我的代码示例非常简单,不要忘记处理错误和所有错误(请参阅我在上面提供的链接,该链接已完成).

Mongodb相关问答推荐

在MogoDB中按时间间隔分组、统计文档和获取间隔时间

如何使用ID数组对一个集合中的金额求和并更新另一个集合中的字段?

我无法将文档发送到我的MongoDB集合,因为它告诉我使文档无效

如何在Mongodb Mongoose Nodejs中提取不等于一组值的字段

将子元素的数组值提取到 mongodb 中的单个数组中?

多键索引,性能问题

MongoDB DB参考返回null值

MongoDB 聚合 groupBy 日期并计算子文档

如何为具有相同名称的嵌套字段创建文本索引

Mongo:查找具有 0 个关联文档的文档,成本更低

使用新字段插入数据或使用 updateOne mongodb 有条件地更新

Mongo:投影不影响布尔值

使用 AngularJs 和 MongoDB/Mongoose

从 PHP 打印 MongoDB 日期

返回从循环中调用的数据库查询中检索到的数据的问题

Mongodb:查询嵌套在数组中的json对象

当前的 URL 字符串解析器已弃用

MongoDB mongoexport 查询

如何在 Ubuntu 10.04 中使用 --auth 选项重新启动 mongodb?

在 MongoDB 中比较日期(moment.js)