Node.js 根据条件从不同集合使用$lookup
我有3个集合驱动程序、用户和分派器。Dispatcher可以是驱动程序或用户我的dispatchers集合如下所示Node.js 根据条件从不同集合使用$lookup,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有3个集合驱动程序、用户和分派器。Dispatcher可以是驱动程序或用户我的dispatchers集合如下所示 { "_id" : ObjectId("5c9bb56a56f1a43e8aedf3c1"), "dispatcherId" : ObjectId("5c3382fe3406281ba6863f7e"), "type" : "driver", "recordedTime" : ISODate("2019-03-27T17:39:54.030Z"), "isEnable" : tru
{
"_id" : ObjectId("5c9bb56a56f1a43e8aedf3c1"),
"dispatcherId" : ObjectId("5c3382fe3406281ba6863f7e"),
"type" : "driver",
"recordedTime" : ISODate("2019-03-27T17:39:54.030Z"),
"isEnable" : true,
"dispatchPackageType" : "commission",
"__v" : 0
}
dispatcherId来自驱动程序或用户集合。类型为“驱动程序”或“用户”。
如果类型为“driver”$lookup from drivers,如果类型为user$lookup from“users”,我想编写一个查询。我实现了这个,但是我找不到检查条件的方法
Dispatcher.aggregate([{
$match: {
'type': 'driver'
}
},{
$lookup: {
from: "drivers",
localField: "dispatcherId",
foreignField: "_id",
as: "dispatcherDetails"
}
}, {
$project: {
'dispatcherDetails.otpPin': 0,
'dispatcherDetails.saltSecret': 0,
'dispatcherDetails.otpTime': 0
}
}
])
在这里,您可以使用mongoose模式的
refType
选项。我试着用这个例子向您解释refType
const mongoose = require('mongoose');
const dispatcherSchema = new mongoose.Schema({
type: { type: String, enum: ["User", "Driver"] },
dispatcherId: { type: mongoose.Schema.Types.ObjectId, refPath: "type" }
});
const Dispatcher = mongoose.model("Dispatcher", dispatcherSchema);
const userSchema = new mongoose.Schema({
username: String
});
const User = mongoose.model('User', userSchema);
const driverSchema = new mongoose.Schema({
drivername: String
});
const Driver = mongoose.model('Driver', driverSchema);
// Dispatcher.find().populate('dispatcherId'); this is just for your reference
这里我们有三个集合
'User'
,'Driver'
和'Dispatcher'
。现在,当您使用populate('dispatcherId')执行mongoose查询时
它将从dispatcher文档中获取dispatcherId字段,并根据类型字段中存储的值将dispatcherId值与集合用户或驱动程序匹配。目前,无法使用查找实现此功能,但如果要实现此功能,可以使用mongoose填充方法。如果你对猫鼬很好,我知道我会发布answer@PavanVora感谢您的回复,如果您有任何答案,请发布。dispatcherId
是用户
和驱动程序
集合中的公共字段。我说的对吗?@AnthonyWinzlet是的,它是_id字段形式的驱动程序或用户,您可能应该在mongoose文档中查看。与实际拥有不同的“物理集合”不同,这基本上是将事物放在同一个集合中,并使用表示“类型”的\uu t
字段。它基本上是多态性的,因为您可以将不同的模式和方法抽象为“对象”,它们显示为不同的模型,但实际上存储在同一个集合中。从“MongoDB的观点”来看,$lookup
基本上是在“单个集合”上完成的,并按“类型”进行过滤(如果需要),或者不同时进行过滤。谢谢,这对我来说很有效。如何投影所需的字段?refPath:“userType”应该是refPath:“type”不是吗?@Chathura yes refPath将是相等的类型。要投影需要使用的字段,可以在populate方法中以字符串形式传递第二个参数,如.populate('dispatcherId','username')。要选择更多项目,请在填充方法中将空格分隔的字符串(如电子邮件和电话)作为“电子邮件电话”传递第二个参数