根据另一个字段值 mongodb mongoose 从文档中排除字段

Posted

技术标签:

【中文标题】根据另一个字段值 mongodb mongoose 从文档中排除字段【英文标题】:Exclude field from a document based on another field value mongodb mongoose 【发布时间】:2021-11-13 08:17:38 【问题描述】:

我有一个users 架构,其中有一个companies 字段,如果role 字段值为admin,我只想选择它,否则它不应该在查找查询中返回。

user 架构:


const userInfoSchema = new mongoose.Schema(
  ...,
  companies: [
    
      type: mongoose.Schema.ObjectId,
      ref: 'companyinfos',
    ,
  ],
  role: 
    type: String,
    enum: ['user', 'admin', 'employee'],
    default: 'user',
  ,
);

我试图通过使用 pre find hook 来解​​决这个问题,但无法排除公司字段。

userInfoSchema.post(/^find/, function (doc, next) 
  if (doc.role !== 'admin') 
    this.find().select('-companies');
  

  next();
);

或者有没有什么方法可以根据role的值在userInfoSchema的companies字段中有条件地设置select

请帮忙。

【问题讨论】:

【参考方案1】:

使用聚合

db.collection.aggregate([
  
    "$project": 
      companies: 
        "$cond": 
          "if": 
            $eq: [
              "$role",
              "admin"
            ]
          ,
          "then": "$companies",
          "else": 0
        
      
    
  ,
  
    $match: 
      companies: 
        $ne: 0
      
    
  
])

https://mongoplayground.net/p/I8HGvz6h7MP

【讨论】:

以上是关于根据另一个字段值 mongodb mongoose 从文档中排除字段的主要内容,如果未能解决你的问题,请参考以下文章

UpdateOne MongoDB 使用来自另一个字段的值进行推送

如何根据另一个字段更新 mongodb 中的数组 dict 元素

使用mongoose在mongodb中按升序和降序对多个字段进行排序

如何对 MongoDB 集合中字段的不同值求和(利用 mongoose)

如何使用 MongoDB/Mongoose 中的先前值更新字段 [重复]

Paginate Mongoose / MongoDB查询:从一个点开始按两个字段排序[重复]