如何使用 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 查询更改架构内的方案数组内的值。?