mongodb - Mongodb 从文档上的多个数组更新元素
问题描述
我想从位于 MongoDB 集合文档的多个列表中的对象更新属性。
在 MongoDB 集合中,我有这样的文档:
{
"firstArray": [
{
"name": "john",
"updated": false // I wanna switch that to true
},
{
"name": "bob",
"updated": false
}
],
"secondArray": [
{
"name": "eric",
"updated": false
},
{
"name": "john",
"updated": false // I wanna switch that to true
}
]
}
"name":"john"
我的目标是使用from 文档的属性firstArray
和secondArray
to更新每个元素updated:true
。
由于它们可以是对文档的并行访问,因此我将只使用更新运算符(一种读取和替换方法,这样会增加丢弃另一个进程所做更改的风险)
看起来该问题中提到的过滤位置运算符 $[]是从文档的数组更新对象属性的方法,但它似乎不支持多个具有相同运算符或使用两个运算符(一个由数组)在两个不同的!$set
$set
由于此 mongo shell 命令仅更新secondArray
:
db['collection'].update(
{},
{
"$set": { "firstArray.$[elem].updated": true },
"$set": { "secondArray.$[elem].updated": true }
},
{ "arrayFilters": [{ "elem.name": "john" }], "multi": true })
这个命令返回The array filter for identifier 'a' was not used in the update { $set: { secondArray.$[b].updated: true } }
:
db['collection'].update(
{},
{
"$set": { "firstArray.$[a].updated": true },
"$set": { "secondArray.$[b].updated": true }
},
{ "arrayFilters": [{ "a.name": "john" }, { "b.name": "john" }], "multi": true })
那么,您知道如何进行更新吗?(有关上述限制的任何文档引用的奖励点)
谢谢!
解决方案
对象中该函数的第二个参数。一个给定的字段名在一个对象中只能有一个值。为了显示发送到服务器的内容,我将您使用的值分配给了一个变量:
> var o={
"$set": { "firstArray.$[a].updated": true },
"$set": { "secondArray.$[b].updated": true }
};
> printjson(o)
{ "$set" : { "secondArray.$[b].updated" : true } }
如您所见,第一个值被第二个覆盖,因为两个字段都命名为$set
.
尝试将它们组合成一个字段:
{
"$set": {
"firstArray.$[elem].updated": true,
"secondArray.$[elem].updated": true
}
}
推荐阅读
- python - 如何将字符向量与方阵连接起来
- tensorflow - 张量流。针对特定任务的多对象检测
- php - Sphinx(searchd)无法找到新索引的文档
- python - 当两个用户同时输入时,SQL 会覆盖数据(Python)
- r - 从R中列表列中的所有列表中删除特定数字
- ajax - 通过 Ajax 向同一个 HTTP/2 服务器请求多个资源的最快方式
- regex - 在 Redshift 中搜索短语列表的文本
- sql-server - 3 个表上的 OUTER JOIN,条件仅存在于外部两个表中
- spring-security - 访问受保护资源时发生 AuthenticationCredentialsNotFoundException
- c++ - 提供输入流的受限视图