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似乎使这种情况变得有点棘手,因为它不支持连接。我认为我们需要的是两个问题:
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()
,缩短了语法。我还发现这篇文章可以提供更多的帮助:但是不需要放置两个查询,因为使用单个查询可以很容易地完成