MongoDB - 如何从嵌套数组的元素中删除字段?

3

我有一个文档的结构如下:

{
    "Name": "Test",
    "FieldsCollection": [{
        "GroupName": "Group",
        "Fields": [{
            "FieldName": "ABC",
            "Fields": {
                "item1": "value1",
                "item2": "value2"
            }
        }]
    }]
}

我需要将它更改为以下内容:

{
    "Name": "Test",
    "FieldsCollection": [{
        "GroupName": "Group",
        "Fields": [{
            "FieldName": "ABC",
            "item1": "value1",
            "item2": "value2"
        }]
    }]
}

假设“item1:“value1”,“item2:“value2”对于我的集合中的所有文档都是常量,我认为我可以只删除“FieldsCollection.Fields.Fields”并添加“item1:“value1”,“item2:“value2””。
我尝试了以下查询:
db.getCollection('Devices').update(
    {"FieldsCollection.Fields.FieldName":"ABC"},
    {$unset: {"FieldsCollection.Fields.Fields":1}},
    {multi:true}
)

但是它没有起作用。

我可以使用什么查询来执行这个更改?


https://docs.mongodb.com/v3.6/reference/operator/update/positional/index.html#nested-arrays - Alex Blex
你的 fields.fields 是一个对象而不是数组吗? - Prajval M
@AlexBlex,这是不可能的吗?我提供了我使用的查询,你能帮忙调整一下吗? - Liran Friedman
你的删除操作查询不正确。 - Prajval M
@PrajvalM,如果是这样的话,我就不会问这个问题了...你知道为什么吗? - Liran Friedman
2个回答

8

在3.6中使用位置占位符$[all](第一层)和[<identifier>](第二层)进行操作。

类似于:

db.getCollection('Devices').update(
    {"FieldsCollection.Fields.FieldName":"ABC"},
    {$unset: {"FieldsCollection.$[].Fields.$[f].Fields":1}, 
     $set:{"FieldsCollection.$[].Fields.$[f].item1":"value1",
           "FieldsCollection.$[].Fields.$[f].item2":"value2"}
    },  
    {arrayFilters: [{ "f.FieldName":"ABC"} ],multi:true }
)

这里出现了以下错误:`执行脚本失败。错误:当使用对象指定upsert和multi时,第四个参数必须为空。: DBCollection.prototype._parseUpdate@src/mongo/shell/collection.js:522:1 DBCollection.prototype.update@src/mongo/shell/collection.js:552:18 @(shell):1:1` - Liran Friedman
可能是因为我正在使用RoboMongo吗? - Liran Friedman
@LiranFriedman,不是的,$set需要来自查询的常量值,而不是文档中的值。请参见https://jira.mongodb.org/browse/SERVER-11345。除非已知并且所有文档中的嵌套属性相同,否则$set将无法工作。 - Alex Blex
抱歉,我错过了问题的第二部分。你是对的。$set应该可以工作。已更新答案。 - s7vr
谢谢你的帮助 :-) - Liran Friedman
显示剩余4条评论

1
作为一个对象,Fields.Fields 很难处理。
这是删除的查询语句:
db.getCollection('Devices').update(
    {Name : "test", "FieldsCollection.Fields.FieldName":"ABC"},
    {$unset: {"FieldsCollection.Fields.$.Fields":1}},
    {multi:true}
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接