删除嵌套文档数组中的特定属性
Removing a specific attribute in an array of nested documents
对不起我的英语,我来自俄罗斯。
我问了俄文版的this question,但是他们还没有回答。
有一个记录 collection 存储档案文件。这是它的简化结构(我省略了大部分属性):
{
"_id": 1,
"tomes": [
{
"number":1,
"archive_number":1
},
{
"number":2,
"archive_number":1
}
]
}
{
"_id": 2,
"tomes": [
{
"number":1,
"archive_number":1
},
{
"number":2,
"archive_number":1
},
{
"number":3,
"archive_number":1
}
]
}
我需要从 tomes 数组中的所有文档的每个嵌套文档中删除 archive_number 属性记录 collection.
删除后,结构应该是这样的:
{
"_id": 1,
"tomes": [
{
"number":1,
},
{
"number":2,
}
]
}
{
"_id": 2,
"tomes": [
{
"number":1,
},
{
"number":2,
},
{
"number":3,
}
]
}
我能够编写这样的查询:
db.record.update(
{
"tomes": {
$elemMatch:{
"archive_number":{$exists:true}
}
}
},
{
$unset: {
"tomes.$.archive_number":1
}
},
false, true
)
但此查询仅删除每个存档案例一个卷上的 archive_number 属性。即启动后,我们会看到如下图:
{
"_id": 1,
"tomes": [
{
"number":1,
},
{
"number":2,
"archive_number":1
}
]
}
{
"_id": 2,
"tomes": [
{
"number":1,
},
{
"number":2,
"archive_number":1
},
{
"number":3,
"archive_number":1
}
]
}
你能告诉我如何删除所有卷吗?不知道怎么改正要求,脑袋都看不懂了
解决方案 1
使用 $[<indentifier>]
(过滤后的位置运算符)和 arrayFilters
更新数组中的文档。
db.collection.update({
"tomes": {
$elemMatch: {
"archive_number": {
$exists: true
}
}
}
},
{
$unset: {
"tomes.$[tome].archive_number": 1
}
},
{
arrayFilters: [
{
"tome.archive_number": {
$exists: true
}
}
],
multi: true
})
Sample Mongo Playground (Solution 1)
解决方案 2
With $[]
(所有位置运算符)。
The all positional operator $[] indicates that the update operator should modify all elements in the specified array field.
db.collection.update({
"tomes": {
$elemMatch: {
"archive_number": {
$exists: true
}
}
}
},
{
$unset: {
"tomes.$[].archive_number": 1
}
},
{
multi: true
})
Sample Mongo Playground (Solution 2)
参考资料
对不起我的英语,我来自俄罗斯。
我问了俄文版的this question,但是他们还没有回答。
有一个记录 collection 存储档案文件。这是它的简化结构(我省略了大部分属性):
{
"_id": 1,
"tomes": [
{
"number":1,
"archive_number":1
},
{
"number":2,
"archive_number":1
}
]
}
{
"_id": 2,
"tomes": [
{
"number":1,
"archive_number":1
},
{
"number":2,
"archive_number":1
},
{
"number":3,
"archive_number":1
}
]
}
我需要从 tomes 数组中的所有文档的每个嵌套文档中删除 archive_number 属性记录 collection.
删除后,结构应该是这样的:
{
"_id": 1,
"tomes": [
{
"number":1,
},
{
"number":2,
}
]
}
{
"_id": 2,
"tomes": [
{
"number":1,
},
{
"number":2,
},
{
"number":3,
}
]
}
我能够编写这样的查询:
db.record.update(
{
"tomes": {
$elemMatch:{
"archive_number":{$exists:true}
}
}
},
{
$unset: {
"tomes.$.archive_number":1
}
},
false, true
)
但此查询仅删除每个存档案例一个卷上的 archive_number 属性。即启动后,我们会看到如下图:
{
"_id": 1,
"tomes": [
{
"number":1,
},
{
"number":2,
"archive_number":1
}
]
}
{
"_id": 2,
"tomes": [
{
"number":1,
},
{
"number":2,
"archive_number":1
},
{
"number":3,
"archive_number":1
}
]
}
你能告诉我如何删除所有卷吗?不知道怎么改正要求,脑袋都看不懂了
解决方案 1
使用 $[<indentifier>]
(过滤后的位置运算符)和 arrayFilters
更新数组中的文档。
db.collection.update({
"tomes": {
$elemMatch: {
"archive_number": {
$exists: true
}
}
}
},
{
$unset: {
"tomes.$[tome].archive_number": 1
}
},
{
arrayFilters: [
{
"tome.archive_number": {
$exists: true
}
}
],
multi: true
})
Sample Mongo Playground (Solution 1)
解决方案 2
With $[]
(所有位置运算符)。
The all positional operator $[] indicates that the update operator should modify all elements in the specified array field.
db.collection.update({
"tomes": {
$elemMatch: {
"archive_number": {
$exists: true
}
}
}
},
{
$unset: {
"tomes.$[].archive_number": 1
}
},
{
multi: true
})
Sample Mongo Playground (Solution 2)