嵌套数组的猫鼬$或条件

Posted

技术标签:

【中文标题】嵌套数组的猫鼬$或条件【英文标题】:Mongoose $or condition for nested array 【发布时间】:2021-06-29 04:24:39 【问题描述】:

有我的架构

//ProjectModel
const ProjectSchema: Schema = new Schema(
 owner:  type: Schema.Types.ObjectId, ref: "User" ,
 users: [type: Schema.Types.ObjectId, ref: "ProjectUser", unique: true ]
);

//Project User model
const ProjectUserSchema = new Schema(
  
    user:  type: Schema.Types.ObjectId, ref: "User", require: true ,
    role: 
      type: String,
      default: 'basic',
      enum: ["basic", "projectuser", "moderator", "admin"]
    ,
    project:  type: Schema.Types.ObjectId, ref: "Project", require: true ,
  ,
  
    timestamps: true,
    usePushEach: true,
  
);

User 模型具有常用字段,如密码、姓名等。

我想在 所有者 (UserSchema)用户 (ProjectUserSchema) 中查找 ProjectModel用户强>

ProjectModel.findOne()
                    .or([ owner: req.params.user ,  "users.user": req.params.user ])
                    .then(project => 
                        res.json(project);
                    );

但它返回 null。条件.or([ owner: req.params.user , "users._id": "PROJECT USER ID" ]) 也不起作用。

我该怎么办?

【问题讨论】:

嗨,AIT。请从ProjectSchema / projects 收藏中发布一些文件。谢谢。 【参考方案1】:

您需要将传入的req.params.user 从字符串转换为ObjectId。试试这个:

const mongoose = require('mongoose');

const getProjectByUser = (req, res) => 
  let userId = mongoose.Types.ObjectId(req.params.user);

  ProjectModel
    .findOne(
      $or: [
         "owner": userId ,
         "users": userId 
      ]
    )
    .then(project => 
      res.json(project);
    )
    .catch(e => 
      res.json( error: "Error!" );
    );

【讨论】:

应该是“users.user” 为什么?它不是 ProjectSchema 中看到的嵌套对象。 ownerUser 类型,usersProjectUser 类型。 ProjectUser 包含 user 类型的字段 User 我相信users 内的ProjectSchema 数组将是ObjectIds 的数组。在这里查看:mongoosejs.com/docs/populate.html 是的,但它不是User 的数组,而是ProjectUser 具有以下字段的数组:userroleproject。它的结构可以是users[0].role, users[0].user, ...

以上是关于嵌套数组的猫鼬$或条件的主要内容,如果未能解决你的问题,请参考以下文章

无法查询嵌套的猫鼬数组?

更新混合类型的猫鼬嵌套数组

嵌套数组上的猫鼬聚合

使用没有数组的嵌套文档为我的 JSON 定义有效的猫鼬模式?

嵌套模式/子文档对象中的猫鼬 findById() - 聚合

嵌套的猫鼬填充了承诺