Node.js 根据条件从不同集合使用$lookup

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

我有3个集合驱动程序、用户和分派器。Dispatcher可以是驱动程序或用户我的dispatchers集合如下所示

{
"_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')。要选择更多项目,请在填充方法中将空格分隔的字符串(如电子邮件和电话)作为“电子邮件电话”传递第二个参数