如何使用 mongoose 或 mongodb 查询更改架构内的方案数组内的值。?

Posted

技术标签:

【中文标题】如何使用 mongoose 或 mongodb 查询更改架构内的方案数组内的值。?【英文标题】:How can I Change value inside array of schemes inside schema with mongoose or mongodb query.? 【发布时间】:2021-06-29 05:52:53 【问题描述】:

我有以下架构类型: 派特网:

var PaitentSchema = new mongoose.Schema(
    username: String,
    password: String,
    name: String,
    protocol: 
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Protocol'
    ,

    treatmentTypes: [
        type: mongoose.Schema.Types.ObjectId,
        ref: 'TreatmentType'
    ],

    accesses: [AccessSchema],
    reports: [ReportSchema],
,  collection: ' Paitents' );

和 AccessSchema:

var AccessSchema = new mongoose.Schema(
    stageBool: Boolean,
    exerciseBool: [ type: Boolean ]

);

我想要做的是更新 exerciseBool 数组,例如将数组中的一个值从“false”更改为“true”。 我已经尝试过这段代码及其对我的工作,但问题是我从客户端获取索引,所以我需要以 动态方式 嵌入索引(不总是 0 和 1)

这是我所做的(不是动态的):

  const paitent = await Paitent.updateOne( username: req.params.username , 
         $set:  "accesses.0.exerciseBool.1": true  );

我想做这样的事情,但以动态索引的方式。 请问有人可以帮助我吗? 谢谢。

【问题讨论】:

【参考方案1】:

正如你所说,索引是已知的,但值可能会改变。

您可以使用以下内容来创建您的查询。

const accessesIndex = 0;
const exerciseBoolIndex = 1;

const update =  $set:  [`accesses.$accessesIndex.exerciseBool.$exerciseBoolIndex`]: true  ;

console.log(update);

//const paitent = await Paitent.updateOne( username: req.params.username , update); // run your update query like this

https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Template_literals


更新

检查索引是否存在然后只更新记录。

在您的查询中添加"accesses.0.exerciseBool.1": $exists: true 以确保accesses.0.exerciseBool.1 存在于记录中。

const accessesIndex = 0;
const exerciseBoolIndex = 1;

const username = 'abc';

const key = `accesses.$accessesIndex.exerciseBool.$exerciseBoolIndex`;

const query =   username, [key]:  "$exists": true  ;

console.log('query:', query);

const update =  $set:  [key]: true  ;

console.log('update:', update);

更新工作演示 - https://mongoplayground.net/p/GNOuZr3wqqw

没有更新演示 - https://mongoplayground.net/p/nsTC8s-ruyo

【讨论】:

@ Tushar 如果数组在输入index 中不包含元素,则您的方法存在一个问题,那么它将创建index - n 元素数量。例如,如果数组有 3 个元素,并且您将索引传递为 10,那么它将在数组内创建 7 个具有空值的元素。 @DheemanthBhat 感谢您的反馈更新了答案:) @DheemanthBhat 感谢您的边缘案例思维,干杯伙伴:)【参考方案2】:

如果您使用的是 MongoDB 版本 >= 4.4。您可以使用 $function 和 update-with-aggregation-pipeline 来动态更新数组。试试这个:

let index1 = 0;
let index2 = 1;

db.patients.updateOne(
     username: "dhee" ,
    [
        
            $set: 
                accesses: 
                    $function: 
                        body: function(accesses, index1, index2) 
                            if (accesses[index1] != null
                                && accesses[index1].exerciseBool[index2] != null) 
                                accesses[index1].exerciseBool[index2] = true;
                            

                            return accesses;
                        ,
                        args: ["$accesses", index1, index2],
                        lang: "js"
                    
                
            
        
    ]
);

【讨论】:

以上是关于如何使用 mongoose 或 mongodb 查询更改架构内的方案数组内的值。?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB:如何使用 Mongoose 添加或更新子文档?

如何使用 Mongodb 或 Mongoose 查询并使用 javascript 打印?

MongoDB数据库安装与基本操作 - mongoose - 增删改查

如何使用 mongoose 或 mongodb 查询更改架构内的方案数组内的值。?

mongoose入门以及 mongoose 实现数据 的增删改查

mongoDB (mongoose增删改查聚合索引连接备份与恢复监控等等)