我在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"
}
]}
任何人都知道我做错了什么?我应该删除该条目并重新创建吗?
答案 0 :(得分: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"
。它的工作原理是因为数组也是对象,每个索引位置都是属性/键。