在mongodb中的嵌套数组中插入数据

Roh*_*mar 3 php mongodb

可能重复:
MongoDB更新嵌套数组中的字段

我有以下数据:

{ 
    "_id" : ObjectId("4f855061dd53351011000b42"), 
    "act_mgr" : [{ "sales" : {"agent" : ["rohan@walkover.in" ],  "last_interacted" : "rohan@walkover.in" } } ],
    "email" : "aman@asasas.com", "name" : "Aman",
    "sales" : [{"sno" : 1,  "message" : "description","status" : "open"},{"sno" : 12,"message" : "assad","status" :"open"}]
}
Run Code Online (Sandbox Code Playgroud)

我想在act_mgr中添加新的代理并更新last_interacted:sales就是这样的

"act_mgr" : [{ "sales" : {"agent" : ["rohan@walkover.in","abc@walkover.in" ],
 "last_interacted" : "abc@walkover.in" } } ]
Run Code Online (Sandbox Code Playgroud)

此外,如果我像开发人员一样添加新的act_mgr,那就像是

 "act_mgr" : [{ "sales" : {"agent" : ["rohan@walkover.in","abc@walkover.in" ],  "last_interacted" : "abc@walkover.in" } },
 { "developer" : {"agent" : ["newdeveloper@walkover.in" ],  "last_interacted" : "newdeveloper@walkover.in" } } ]
Run Code Online (Sandbox Code Playgroud)

我不知道如何添加这些字段

Mar*_*arc 5

您可以使用以下更新语句更新"act_mgr"数组中的嵌入式"sales"文档:

> db.sales.update({"act_mgr.sales.last_interacted":"rohan@walkover.in"}, {$push:{"act_mgr.$.sales.agent":"abc@walkover.in"}, $set:{"act_mgr.$.sales.last_interacted":"abc@walkover.in"}})
> db.sales.find().pretty()
{
    "_id" : ObjectId("4f855061dd53351011000b42"),
    "act_mgr" : [
        {
            "sales" : {
                "agent" : [
                    "rohan@walkover.in",
                    "abc@walkover.in"
                ],
                "last_interacted" : "abc@walkover.in"
            }
        }
    ],
    "email" : "aman@asasas.com",
    "name" : "Aman",
    "sales" : [
        {
            "sno" : 1,
            "message" : "description",
            "status" : "open"
        },
        {
            "sno" : 12,
            "message" : "assad",
            "status" : "open"
        }
    ]
}
> 
Run Code Online (Sandbox Code Playgroud)

您可以将包含"开发人员"信息的嵌入式文档添加到数组中,如下所示:

> db.sales.update({"_id" : ObjectId("4f855061dd53351011000b42")}, {$push:{"act_mgr":{ "developer" : {"agent" : ["newdeveloper@walkover.in" ],  "last_interacted" : "newdeveloper@walkover.in" } }}})
> db.sales.find().pretty()
{
    "_id" : ObjectId("4f855061dd53351011000b42"),
    "act_mgr" : [
        {
            "sales" : {
                "agent" : [
                    "rohan@walkover.in",
                    "abc@walkover.in"
                ],
                "last_interacted" : "abc@walkover.in"
            }
        },
        {
            "developer" : {
                "agent" : [
                    "newdeveloper@walkover.in"
                ],
                "last_interacted" : "newdeveloper@walkover.in"
            }
        }
    ],
    "email" : "aman@asasas.com",
    "name" : "Aman",
    "sales" : [
        {
            "sno" : 1,
            "message" : "description",
            "status" : "open"
        },
        {
            "sno" : 12,
            "message" : "assad",
            "status" : "open"
        }
    ]
}
> 
Run Code Online (Sandbox Code Playgroud)

有关$ push和$ set修饰符的文档可以在"更新"文档中找到:http: //www.mongodb.org/display/DOCS/Updating

有关使用Mongo db创建和更新嵌入式文档的更多信息,请参阅标题为"点符号(到达对象)"的文档 http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects %29

有关使用"$"位置运算符更新嵌入文档的信息可以在"更新"文档的"$ location operator"部分找到.
http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

需要注意的是:嵌入式文档通常与相同的结构相匹配通常更为常见,因此可以更容易地引用单个嵌入式文档.你的"销售"阵列就是一个很好的例子; 每个嵌入的文档包含相同的键,"sno","message"和"status"

但是,"act_mgr"数组中的嵌入文档包含不同的键; 第一个包含"sales",第二个包含"developer".相反,可以考虑以下结构:

"act_mgr" : [
    {
        "title" : "sales",
        "agent" : [
            "rohan@walkover.in",
            "abc@walkover.in"
        ],
        "last_interacted" : "abc@walkover.in"
    },
    {
        "title": "developer",
        "agent" : [
            "newdeveloper@walkover.in"
        ],
        "last_interacted" : "newdeveloper@walkover.in"
    }
]
Run Code Online (Sandbox Code Playgroud)

现在,每个嵌入的文档都包含相同的键,"标题","代理"和"last_interacted".

您可以使用以下命令更新子文档.

> db.sales.update({"act_mgr.title":"sales"}, {$push:{"act_mgr.$.agent":"abc@walkover.in"}, $set:{"act_mgr.$.last_interacted":"abc@walkover.in"}})
Run Code Online (Sandbox Code Playgroud)

希望这将允许您进行所需的更新,并且可能会给您一些关于模式设计的思考.祝好运!