mongodb - 如何在mongodb中编辑多个嵌入文档
问题描述
我想查找与以下查询匹配的对象,然后将 events 属性设置为空数组(如果匹配)。目前我使用的查询只会更新每个文档中的第一个嵌入对象,但我需要它来检查每个文档中的每个嵌入对象。这是查询,有谁知道我怎样才能做到这一点?
const date_check = moment().subtract(10, 'minutes').format('X')
await Accumulator.updateMany(
{ 'data.lastUpdate': { $lt: date_check } },
{
$set: {
'data.$.events': []
}
}
)
文件看起来像这样...
{
bookmaker: 'Bet365',
sport: 'Football',
data: [
{
lastUpdate: '2372273273',
events: [
... // some event objects
]
},
{
lastUpdate: '2372234421',
events: [
... // some event objects
]
},
{
lastUpdate: '2375343461',
events: [
... // some event objects
]
}
]
}
解决方案
我认为最好将架构更改lastUpdate
为性能数字,并避免错误,检查$toInt
,您可以使用类似于第二个查询的代码来完成。
询问
- 数组过滤器方式
- 用 date_check 替换“2372273273”
- 过滤以保留文档
- 使用 arrayFilters 仅对通过过滤器的成员文档进行更改
db.collection.update({
"data.lastUpdate": {
"$lt": "2372273273"
}
},
{
$set: {
"data.$[data].events": []
}
},
{
"arrayFilters": [
{
"data.lastUpdate": {
"$lt": "2372273273"
}
}
]
})
询问
- 替代管道更新方式
$map
- 将“2372273273”替换为
date_check
- 过滤以查找文档
- 仅更新过滤器为真的成员
管道更新需要 MongoDB >= 4.2
db.collection.update({
"data.lastUpdate": {
"$lt": "2372273273"
}
},
[
{
"$set": {
"data": {
"$map": {
"input": "$data",
"in": {
"$cond": [
{
"$lt": [
"$$this.lastUpdate",
"2372273273"
]
},
{
"$mergeObjects": [
"$$this",
{
"events": []
}
]
},
"$$this"
]
}
}
}
}
}
])
推荐阅读
- mongodb - 使用 socket.io/react.js/mongodb 为两个用户之间的每次聊天寻找最佳/干净方式的伪代码来创建和检查唯一的房间“名称”
- r - 无法使用 R 从 NetCDF 文件中提取 chlor_a 值
- spring - 如何在不泄漏资源的情况下正确实例化 RestTemplate
- c# - 在 C# 中通过递归对矩阵求和子
- python - 不区分大小写的集合交集
- python - 查询镶木地板文件 - 检查正方形是否在其他正方形内
- jenkins - 詹金斯:即使代码语法不正确,构建也不会失败
- java - 如何只更新项目中的 java 运行时?
- html - 将弹性容器内的项目向右移动
- javascript - 可能有一个不同于 API 返回的 Typescript 接口?