node.js - 如何仅获取两个集合之间未加入(排除)的文档?

标签 node.js mongodb mongodb-query

问题出在两个集合“用户”和“表单”上。每个用户都通过 Id 与其表单连接。因此 Forms 集合中的每个表单都有一个 userId 外键。 我需要从 Users 集合中获取所有文档,该集合没有任何与之连接的表单(没有这样的表单)。 在 SQL 中我会做这样的事情: 选择 * 来自用户 U 左连接形式 F ON U._id= F.userId F.userId 为 NULL 的地方

U=A,F=B diagram

我们如何在 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/

相关文章:

c++ - 将数据从 NodeJS 传输到 C++ 应用程序

node.js - 亚马逊 DynamoDB :- Invalid UpdateExpression: Expression size has exceeded the maximum allowed size dynamodb

node.js - 使用 mongoskin 聚合查询

javascript - 为什么 "Promise { <pending> }"没有解析?

javascript - 对本地模块函数的类引用

javascript - 我如何在 Meteor 的 Mongo 查询中使用变量作为字段名称?

node.js - 无法将日志保存到 winston-nodejs 的 mongodb 数据库

mongodb - MongoDB 中的 replaceOne() 和 updateOne() 有什么区别?

node.js - Mongodb 聚合或投影

mongodb - 带有 MongoDB 的重复事件模式