我有两个集合"new_user"和"workspace".我正在try 执行查找查询,但它在预期的字段中只给出了空array.

我的‘new_Users’集合:

export class UserEntity {
    @Prop({ required: false, type: Types.ObjectId, default: () => new ObjectId() })
    _id?: Types.ObjectId;

    @Expose()
    @Prop({ default: '', trim: true, text: true })
    firstName: string;

    @Expose()
    @Prop({ default: '', trim: true, text: true })
    lastName: string;
}

我的"工作空间"Collection :


export class WorkspaceUsers {
    @Expose()
    @Prop({ type: () => [WorkspaceUserGroup] })
    groups: WorkspaceUserGroup[];

    @Expose()
    @Prop({ required: true, type: String, enum: WorkspaceRoleEnum })
    workSpaceRole: WorkspaceRoleEnum;

    @Expose()
    @Prop({ required: true, type: String, ref: () => UserEntity })
    userID: string;
}

export class WorkspaceEntity {

    @Prop({ required: false, type: Types.ObjectId, default: () => new ObjectId() })
    _id?: Types.ObjectId;
    
    @Expose()
    @IsString()
    @IsDefined()
    @Prop({ required: true, trim: true })
    name: string;
    

    @Expose()
    @IsOptional()
    @IsArray()
    @ValidateNested({ each: true })
    @Type(() => WorkspaceUsers)
    @Prop({ required: false, type: () => [WorkspaceUsers], default: [] })
    users: WorkspaceUsers[];
}

现在,我想在我的工作区模型中运行查找查询,如下所示:

    const aggregationQuery: PipelineStage[] = [];

    aggregationQuery.push({
        $unwind: '$users',
    });

    aggregationQuery.push({
        $lookup: {
            from: 'new_users',
            localField: 'users.userID',
            foreignField: '_id',
            as: 'userData',
        },
    });

它在用户数据字段中返回一个空array.我到底做错了什么?

推荐答案

问题是您试图在查找阶段匹配一个字符串和一个对象ID,因此它返回一个空数组

您可以将模型更改为userID等于Types.ObjectId,也可以在聚合阶段进行管理.例如,在管道阶段将字符串字段转换为对象id字段

例如,您可以在执行查找之前使用$addFields将字符串字段转换为对象id字段

db.workspaces.aggregate([
  {
    $unwind: "$users"
  },
  {
    $addFields: {
      "users.userID": {
        $toObjectId: "$users.userID"
      }
    }
  },
  {
    $lookup: {
      from: "new_users",
      localField: "users.userID",
      foreignField: "_id",
      as: "userData"
    }
  }
])

sample playground

Typescript相关问答推荐

排序更改数组类型

无需刷新即可让现场访客逆变

如何使用属性作为具有Generics的TypScript类中的类型守护?

TypeScript实用程序类型—至少需要一个属性的接口,某些指定属性除外

类型脚本`Return;`vs`Return unfined;`

无法正确推断嵌套泛型?

未在DIST中正确编译TypeScrip src模块导入

TypeScrip 5.3和5.4-对`Readonly<;[...number[],字符串]>;`的测试版处理:有什么变化?

以Angular 自定义快捷菜单

为什么我的动画状态在组件实例之间共享?

为什么我的导航在使用Typescript的React Native中不起作用?

我可以使用typeof来强制执行某些字符串吗

在Reaction中折叠手风琴

扩展对象的此内容(&Q;)

TypeScrip:使用Cypress测试包含插槽的Vue3组件

是否可以将类型参数约束为不具有属性?

如何在Vuetify 3中导入TypeScript类型?

递归JSON类型脚本不接受 node 值中的变量

React-Router V6 中的递归好友路由

如果父级被删除或删除,如何自动删除子级?