问题出在两个集合“用户”和“表单”上。每个用户都通过 Id 与其表单连接。因此 Forms 集合中的每个表单都有一个 userId 外键。 我需要从 Users 集合中获取所有文档,该集合没有任何与之连接的表单(没有这样的表单)。 在 SQL 中我会做这样的事情: 选择 * 来自用户 U 左连接形式 F ON U._id= F.userId F.userId 为 NULL 的地方
U=A,F=B
我们如何在 MongoDb 中实现此功能,可能是在 NodeJs 端使用 Mongoose 实现?我找不到任何基于 $lookup 聚合的解决方案。
架构: *employeeId 是对 Users _id 的引用
let FormsSchema = new Schema({
employeeId:{
type:Schema.Types.ObjectId , ref:'User'
},
companyId:{
type:Schema.Types.ObjectId
},
formData : {
type:String
},
formType : {
type:String
},
formDate :{
type:Date,default: Date.now
},
formState: {
type: String, required: true, enum: ["new","draft","aproved","pendingHR","pendingEMP","pendingSigned"], default: "new"
},
messageData : {
type:Schema.Types.Mixed
},
formIdkunDate:{
type:Date,default: Date.now
},
attachmentDirty:{
type:Boolean
},
company : {
type:Schema.Types.Mixed
},
formShnatMas : {
type:String
},
sendDate : {
type:Date,default: Date.now
},
draftDate : {
type:Date,default: Date.now
},
fixDate : {
type:Date,default: Date.now
},
is101FormOpenedAfterArchive : {
type:Boolean
},
}
let UserSchema = new Schema({
userName:{
type:String,
trim:true
},
CreateDate :{
type:Date,default: Date.now
},
UpdateDate :{
type:Date,default: Date.now
},
password : {
type:String,
required: true,
trim:true
},
isFirstEntrance : {
type:Boolean
},
resetToken : {
type:String
},
resetPasswordExpires : {
type:String
},
resetOtpPassExpires : {
type:String
},
otpPass : {
type:String,
trim:true
},
userType: {
type: String, required: true, enum: ["employee","hr","admin"], default: "employee"
} ,
employeeData : {
type:Schema.Types.Mixed
},
partnerData : {
type:Schema.Types.Mixed
},
externalId : {
type:String
},
isChangedFromPrevious : {
type:Boolean
},
isFirstYearWorker101 : {
type:Boolean
},
lastLogin :{
type:Number
},
loginAttempts : {
type:Number
},
});
最佳答案
我遵循了您给出的架构,并且能够从 Users 集合中获取所有文档,该集合没有使用 $lookup
连接到任何表单。请使用下面的聚合查询
db.user.aggregate([
{
$lookup:{
"localField": "_id",
"from": "form",
"foreignField": "employeeId",
"as": "forminfo"
}
},{
$match:{
forminfo: {$size: 0}
}
}
])
关于node.js - 如何仅获取两个集合之间未加入(排除)的文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55397378/