javascript - Mongoose - 按填充对象的字段搜索对象

标签 javascript node.js mongodb mongoose

我有一个 Mongoose 模式:

var ClientRentalSchema = new mongoose.Schema({
    carId: { 
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Car'
    },
    userId: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    },
    startDate: Date,
    endDate: Date,
    payment: Number,
    status: { type: String, default: "Oczekujące" },
    discount: { type: Number, default: 0 }
});

现在,我试图通过用户的身份证号码查找对象。首先,我得到的最接近的是这段代码:

Rental.find()
         .populate('userId', 'idNumber')
         .findOne({'userId.idNumber': 'XYZ 987654'})
        .exec( (err, values) => {
            if(err) return err;
            res.json(values);
    })

它给出了一个空值。这是填充后的示例租赁对象:

{"status":"Aktywne",
"discount":0.2,
"_id":"5ae06b49abafb90e20359892",
"carId":"5ad6186ebd371940e4131f71",
"userId":{"_id":"5ad8e077a59b7d58fc2384bd",
    "idNumber":"ABC 123456"},
"startDate":"2018-04-26T09:11:00.000Z",
"endDate":"2018-04-29T09:11:00.000Z",
"payment":237.6,
"__v":0}

按用户身份证号搜索租赁的正确方法是什么?

最佳答案

不幸的是,mongoose 似乎使这种情况变得有点棘手,因为它不支持 JOINS。我认为我们需要的是两个查询:

  1. 通过“卡号”查询用户获取用户ID
  2. 获取分配了上述用户 ID 的 Rentals

这可能看起来像:

Users.findOne({'userId': 'XYZ 987654'}), (err, user) => {
    if(err) return err;

    if(user) {
      Rental
        .findOne({'userId': user._id}), (err, rental) => {
          if(err) return err;
          res.json(rental);
      });
    }
  });

这可以很容易地切换为接受多个用户“卡号”并使用 find() 而不是 findOne() 返回多个租金。

关于javascript - Mongoose - 按填充对象的字段搜索对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50139027/

相关文章:

node.js - razorpay webhook 在回调 URL 上发出的请求中未收到 “x-razorpay-signature” header

javascript - 如何过滤 Javascript 数组并维护它的索引?

javascript - 如何切换选择中所有元素的类别?

javascript - Android键盘使用CSS中的单位vh缩小视口(viewport)和元素

node.js - Protractor JS 预处理器

node.js - 使用 playStream() 时出现“'"file"参数必须是非空字符串”错误

java - 将 JSON 与 MongoDB 一起使用?

python - 使用 rdflib 获取数据库中的所有关系

php - 如何在 php artisan make :model command 中使用 Jenssegers\Mongodb\Eloquent\Model 而不是 Illuminate\Database\Eloquent\Model

javascript - 基于子组件的父组件的 Angular 显示/隐藏