【问题标题】:Mongoose query filtersMongoose 查询过滤器
【发布时间】:2021-08-16 14:46:44
【问题描述】:

我有一个像这样的猫鼬模式:

const popupDetails = new mongoose.Schema({
    title:{
        type:String,
        default:""
    },
    message:{
        type:String,
        default:""
    },
    redirectPath:{
        type:String,
        default:null
    },
    creditsScored:{
        type:Number,
        default:0
    },
    isSeen:{
        type:Boolean,
        default:false
    },
    _id:false


})

const popupSchema = new mongoose.Schema({
    user_id:{
        type:mongoose.Schema.Types.ObjectId,
        ref:"User",
        index:1
    },
    popupsArray: [popupDetails]

    
})

现在我想根据 isSeen 是否为假来过滤 popupsArray。我想将 popups 数组中的所有弹出窗口发送到 isSeen 为 false 的客户端,并且随时将 isSeen 更改为 true。我怎样才能做到这一点?

这就是我现在过滤它的方式:

try {
        const reqPopups = await popupSchema.aggregate([
            {
              '$match': {
                'user_id': mongoose.Types.ObjectId(`${user_id}`)
              }
            }, {
              '$unwind': {
                'path': '$popupsArray', 
                'preserveNullAndEmptyArrays': true
              }
            }, {
              '$match': {
                'popupsArray.isSeen': false
              }
            }
          ])
          res.json({user_id,reqPopups})
    } catch (error) {
        console.log(error);
        res.json({error})
    }

有什么建议吗?

【问题讨论】:

  • 我面临的主要问题是将isSeen改为true。
  • 请展示您创建过滤器的尝试,我们可以从那里更正它。最好用你想要的最终对象输出。如果可能,请附上示例文档。

标签: node.js mongodb express mongoose mern


【解决方案1】:

我认为这会对你有所帮助:

await popupSchema.aggregate([
  {
    $match: {
      $and: [
        {
          _id: mongoose.Types.ObjectId(`${user_id}`)
        },
        {
          isSeen: false
        }
      ]
    }
  },
  {
    $set: {
      isSeen: true
    }
  }
])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2013-01-13
    • 2010-11-13
    • 2015-10-18
    相关资源
    最近更新 更多