2

我有一个“节点”数组的子对象

这是我的 Mongo 文档结构

db.nodes.find()
{   _id : ObjectId("skipped"),
nodeid : "node1"
nodes : [
    {   nodeid : "node11"
        sku : [
            "aaa",
            "bbb",
            "ccc"]
    },
    {   nodeid : "node12"
        sku : [
            "bbb",
            "ddd"]
    }]
}
{   _id : ObjectId("skipped"),
nodeid : "node2"
nodes : [
    {   nodeid : "node21"
        sku : [
            "aaa",
            "bbb",
            "ddd"]
    }]
}

我用:

db.nodes.update({'nodes.sku': 'bbb'},{$pull: {'nodes.$.sku':'bbb'}}, {multi: 1})

有结果:

db.nodes.find()
{   _id : ObjectId("skipped"),
nodeid : "node1"
nodes : [
    {   nodeid : "node11"
        sku : [
            "aaa",
            "ccc"
        ]
    },
    {   nodeid : "node12"
        sku : [
            "bbb",
            "ddd",
        ]
    }
]
}
{   _id : ObjectId("skipped"),
nodeid : "node2"
nodes : [
    {   nodeid : "node21"
        sku : [
            "aaa",
            "ddd"
        ]
    }
]
}

“node1.node12”仍然有对象“bbb”

我尝试使用:

db.nodes.update({'nodes': {$elemMatch: {'sku':'bbb'}}},{$pull: { nodes: {'sku':'bbb'}}}, {multi: 1})

并有结果:

db.nodes.find()
{   _id : ObjectId("skipped"),
nodeid : "node1"
nodes : [
]
}
{   _id : ObjectId("skipped"),
nodeid : "node2"
nodes : [
    {   nodeid : "node21"
        sku : [
            "aaa",
            "ddd"
        ]
    }
]
}

我丢失了“node1”中的所有数据

并从“node2.node12”更正拉取对象

一些建议

谢谢, 瓦西里

4

1 回答 1

2

不幸的是,尚不支持您想要执行的操作。如果您想投票,功能请求票就在这里:

https://jira.mongodb.org/browse/SERVER-1243

与此同时,有几个选择:

  1. 重新设计您的文档。以下是关于建模树结构的常见模式的链接:http: //docs.mongodb.org/manual/tutorial/model-tree-structures/

  2. 继续您当前的设计并执行多次更新或查找、修改应用程序中的节点数组并进行多次更新。请注意,在这些情况下,您将无法原子地在单个文档中进行所有修改。

于 2013-07-22T03:55:34.677 回答