如何使用节点 js 更新 mongo 文档中的数组元素?
Posted
技术标签:
【中文标题】如何使用节点 js 更新 mongo 文档中的数组元素?【英文标题】:How to update the element of an array in mongo document using node js? 【发布时间】:2021-09-15 10:49:08 【问题描述】:这是我的 mongo 文档示例:
_id:ObjectId("60e54vfb99f346446618269")
count:Array
0:Object
date:2021-07-03T15:13:42.200+00:00
count:35
1:Object
date:2021-07-03T15:13:42.200+00:34
count:38
我正在使用节点来处理 api 请求。我想从 mongo 获取数组的最后一个元素并检查日期,如果日期是比现有日期新的日期,我想插入该数据。如果与现有的相同,我想更新现有日期对象中的计数。
如何在节点中做到这一点?我正在使用选择和切片,但我无法获取最后日期并进行比较。如何获取最后一个元素的日期并将其与请求的日期进行比较并发布到数据库?
这是我要发送的对象:
router.route("/update/").put((req, res) =>
const count_update =
date: new Date(),
count: req.body.count
【问题讨论】:
【参考方案1】:您可以从 MongoDB 4.2 开始尝试update with aggregation pipeline,
$cond
检查最后一个元素的date
是否大于输入日期
$substr
获取前 10 个字符表示从完整日期开始的“yyyy-mm-dd”
是的,
$concatArrays
与新的 date
和 count
字段对象连接当前的 count
数组
不,
$map
迭代 count
数组的循环并检查条件,如果 date
与最后一个元素的日期匹配,然后更新 count
字段
$mergeObjects
将当前对象与更新的count
对象合并
var _id = "60e54vfb99f346446618269",
date = new Date("2021-07-04T15:13:42.200+00:35"),
count = 20;
var searchDate = date.toISOString().slice(0,10); // 2021-07-04
await SchemaModel.updateOne(
_id: _id ,
[
$set:
count:
$cond: [
$gt: [searchDate, $substr: [ $last: "$count.date" , 0, 10] ]
,
$concatArrays: [
"$count",
[ date: date, count: count ]
]
,
$map:
input: "$count",
in:
$mergeObjects: [
"$$this",
$cond: [
$eq: ["$$this.date", $last: "$count.date" ]
,
count: count ,
]
]
]
]
)
Playground
【讨论】:
非常感谢您的帮助@turivishal。但问题是我想检查我的日期而不是时间。仅当日期不同时,我才想将新对象添加到数组中。如果是同一天的不同时间,我想更新现有对象。 我想检查我的日期而不是时间 => 好的,我会调查的。 只有当日期不同时,我才想在数组中添加一个新对象 =>这个查询也是这样做的,如果它不只是指出的话。 是的,你的答案是这样做的。但如果时间不同,它会插入新对象。我不想要那个。我只想在当月的日期发生变化时添加新对象。 在“2021-07-03T15:13:42.200+00:34”和“2021-07-03T15:13:42.200+00:35”的情况下,日期是否相同?但时间不同。如果同一天的时间不同,我不想添加新对象。我只想在不同的日子将新对象插入到数组中。 okay 集合中日期字段的数据类型是什么?是日期类型还是字符串类型?以上是关于如何使用节点 js 更新 mongo 文档中的数组元素?的主要内容,如果未能解决你的问题,请参考以下文章