检查用户 ID 是不是在 mongoose 文档中 - 如果是,将属性值更改为 true?

Posted

技术标签:

【中文标题】检查用户 ID 是不是在 mongoose 文档中 - 如果是,将属性值更改为 true?【英文标题】:Check if user id is in mongoose document - if yes, change property value to true?检查用户 ID 是否在 mongoose 文档中 - 如果是,将属性值更改为 true? 【发布时间】:2019-03-13 05:39:38 【问题描述】:

我有一个 expressjs 路由器,它使用 mongoose findById 方法在 MongoDB 集合中查找。它返回一个对象,其中存在一个带有用户 ID 的 userHasSelected 数组。我不想返回用户 ID,而只是检查当前用户(发出请求的用户)是否存在于数组中。如果他是则返回 true 而不是返回用户 ID。

路由器中的 verifytoken 中间件向请求添加了一个用户 ID 属性。该用户 ID 在获取路由器消息中可用 - 我可以以某种方式将其传递给 Mongoose 架构吗???

//我的路由器

router.get('/challenge/:challengeId', verifyToken ,function (req, res)
    //+ Return one challenge and its options
    //- Check if userId is set to options and winner properties
    let userId = req.userId;
    console.log(userId);
    let challengeId = req.params.challengeId;

    Challenge.findById(challengeId, (err, suc)=>
        if(err)
            res.status(304).send(err);
        
        Challenge.
        res.status(200).send(suc);
    );
)

// 和猫鼬模式

const mongoose = require('mongoose');

var Schema = mongoose.Schema;

//Optionsschema is use in the ChallengeSchema
var OptionSchema = new Schema(
    name:  type: String,
    isCorrect :  type: Boolean ,
    description:  type: String ,
    image :  type : String ,
    userHasSelected :  type : Object, get : returnUserChallengeStatus
)

OptionSchema.set('toObject',  getters: true );
OptionSchema.set('toJSON',  getters: true );

var ChallengeSchema = new Schema(
    shortEventId : String,
    organization: String,
    name: String,
    winner: String,
    options : [OptionSchema]
);

ChallengeSchema.set('toObject',  getters: true );
ChallengeSchema.set('toJSON',  getters: true );

ChallengeSchema.virtual('born').get(function(value) 
    return this.name + "plus andet"
);

module.exports = mongoose.model('challenge', ChallengeSchema);

再说一遍 - 我不想从 userHasSelected 数组中返回用户 ID - 只需检查他是否在那里,如果是,使用 getter 或方法将值设置为 true。

更新说明 findById 返回此对象/文档


    "_id":"5b86dc5bfb6fc03893e55001",
    "shortEventId": "d2d3",
    "organization": "Braedstrup",
    "name": "1. december",
    "winner": "5b864cbaa9ce291b148ddd6d",
    "options": [
        
            "name": "Matas",
            "isCorrect": "true",
            "description": "Matas er byens førende indenfor pleje og Matas er byens førende indenfor pleje og omsorg Matas er byens førende indenfor pleje og omsorg",
            "image": "https://cityxpstorage.blob.core.windows.net/images/Matas.png",
            "userHasSelected": [
                
                    "userId": "5b864cbaa9ce291b148ddd6d"
                
            ]
        ,
        
            "name": "Føtex",
            "isCorrect": "false",
            "description": "Føtex er en dejlig butik",
            "image": "https://cityxpstorage.blob.core.windows.net/images/Føtex.png"
        ,
        
            "name": "Kvickly",
            "isCorrect": "false",
            "description": "Kvickly er en dejlig butik",
            "image": "https://cityxpstorage.blob.core.windows.net/images/Matas.png"
        ,
        
            "name": "MC Jørgensen",
            "isCorrect": "false",
            "description": "MC Jørgensen er en dejlig butik",
            "image": "https://cityxpstorage.blob.core.windows.net/images/Matas.png"
        
    ],
    "startDate": "2018-10-06T00:00:00.000Z",
    "endDate": "2018-10-06T23:59:00.000Z"

因此嵌套数组“userHasSelected”包含有关用户 ID 的信息。我不想发送那个 - 相反我想发送一个 userId : true。 我读过 getters 能够处理传出数据。

可能的解决方案

在将对象返回给客户端之前,我可以在路由器 get 方法中进行检查

// If user is in array set user to true. I would like to move this responsibility to the schema / document.
suc.options.forEach(option => 
    if(Array.isArray(option.userHasSelected))
    option.userHasSelected = userId : true
);

但我真的希望架构负责 - 这可能吗?

【问题讨论】:

您能解释一下您所面临的具体问题吗?您正在通过 id 找到挑战,我假设它返回所需的记录。 为什么没有人回答这个问题? 【参考方案1】:

我遇到了类似的问题并找到了解决方法。只需在您负责的模式模式上创建一个可选字段,将其称为“状态”。在您的控制器上,检查您的数组是否包含请求的用户 ID 并写入该字段。例如;

在您的架构上;

    caseStatus: 
        type: Boolean,
        required: false
    ,  
    voters: [
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User',
    ],

然后在你的控制器上;

    let theCase = await Case.find(speciality: res.locals.user_speciality ).exec();

            let status = theCase.voters.includes(res.locals.user_id);
            caseItem.caseStatus = status;

【讨论】:

以上是关于检查用户 ID 是不是在 mongoose 文档中 - 如果是,将属性值更改为 true?的主要内容,如果未能解决你的问题,请参考以下文章

如何在保存在 Mongoose 之前检查数据库中是不是存在嵌入式文档

Mongoose:在集合中查找用户并检查该用户的数组是不是包含 x?

mongoose-schema - 是不是需要子数组+父文档的 ID?

(mongoose/promises) 如何检查文档是不是是使用 findOneAndUpdate 和 upsert 创建的

如果未找到 ID,则 Mongoose 更新文档或插入新文档(Express REST API)

如果未找到 ID,则 Mongoose 更新文档或插入新文档(Express REST API)