在MongoDB中更新嵌入式数组

时间:2013-10-18 10:06:27

标签: mongodb mongodb-query

我在previous question上询问了如何在嵌入式MongoDB文档中查找条目。 现在坐着一个新问题。我的结构如下:

{
    "_id" : ObjectId("5260c4bd95f8e3ad08000000"),
    "ip" : "127.0.0.1",
    "services" : [ 
        {
            "port" : "22"
        }
    ]}

我想在service.port中添加一个新的键/值对,其中端口是22,所以它看起来像这样:

{
    "_id" : ObjectId("5260c4bd95f8e3ad08000000"),
    "ip" : "127.0.0.1",
    "services" : [ 
        {
            "port" : "22",
            "product" : "ssh"
        }
    ]}

这是我运行的更新:

db.hosts.update({ "ip" : "127.0.0.1" }, { $addToSet : { services : { "port" : "22", "product" : "ssh" }}});

这就是我得到的

{
    "_id" : ObjectId("5260c4bd95f8e3ad08000000"),
    "ip" : "127.0.0.1",
    "services" : [ 
        {
            "port" : "22"
        }, 
        {
            "port" : "22",
            "product" : "ssh"
        }
    ]}

任何人都知道我做错了什么?我应该删除该条目并重新创建吗?

1 个答案:

答案 0 :(得分:2)

如果元素不存在,

$addToSet执行$push操作。由于{ "port" : "22", "product" : "ssh" }数组中尚不存在services,因此新文档pushservices

db.hosts.update({ "ip" : "127.0.0.1" }, { $set: { "services.0.product": "ssh" }});

这使用'0'引用services数组的第一个元素,并将其product属性设置为"ssh"。它的工作原理是因为数组也是对象,每个索引位置都是属性/键。