0

我问过一个关于如何在嵌入式 MongoDB 文档中查找条目的问题。现在坐下来处理一个新问题。我的结构看起来像:

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

我想在端口为 22 的 services.port 中添加一个新的键/值对,使其看起来像这样:

{
    "_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"
        }
    ]}

有人知道我在做什么错吗?我应该删除条目并重新创建它吗?

4

1 回答 1

2

$addToSet$push如果元素不存在,则执行操作。由于数组{ "port" : "22", "product" : "ssh" }中尚不存在,因此services将新文档push编入services.

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

这用于'0'引用services数组的第一个元素并将其product属性设置为"ssh"。它之所以有效,是因为数组也是对象,每个索引位置都是一个属性/键。

于 2013-10-18T10:17:54.297 回答