Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongoose-按填充对象的字段搜索对象_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

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

Javascript Mongoose-按填充对象的字段搜索对象,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我有一个猫鼬模式: var ClientRentalSchema = new mongoose.Schema({ carId: { type: mongoose.Schema.Types.ObjectId, ref: 'Car' }, userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, startDate: Date,

我有一个猫鼬模式:

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}

通过用户id卡号搜索租赁的正确方式是什么?

您的问题似乎是试图通过搜索userId.idNumber字段来查询单个文档。如果这是您要做的所有事情,那么您只需要使用findOne()和要匹配的特定字段进行简单搜索

Rental.findOne({'userId.idNumber': 'XYZ 987654'}, function(err, rentalDoc) {
        if(err) return err;
        res.json(values);
})

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

  • 通过查询用户的“卡号”获取用户ID
  • 获取分配了上述用户ID的租金
  • 这可能看起来像:

    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()
    ,返回多个租金来参加这里的聚会。您可以使用Mongodb聚合管道

    我想你可以试试这样的

    Rental.aggregate([
    {
    $lookup:{
    来自:“用户”,
    localField:'userId',
    foreignField:“\u id”,
    as:‘租车司机’
    }
    },
    {$match:{'rentalUsers.idNumber':'XYZ 987654'}
    
    ])
    这似乎是:,看起来答案是在“填充然后在javascript中过滤”上运行的
    .exec()
    ,或者更改架构以在基本架构中包含整个用户对象。(这两个答案都不是很好,但取决于您的情况可能会起作用)必须进行一些编辑,修复了租金查询以将
    userId
    与以前返回的
    用户进行比较。另外,通过删除
    exec()
    并将函数作为参数传递给
    findOne()
    ,缩短了语法。我还发现这篇文章可以提供更多的帮助:但是不需要放置两个查询,因为使用单个查询可以很容易地完成