Вставить данные в вложенный массив в 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"}] } 

Я хочу добавить нового агента и обновить last_interacted в act_mgr: продажа что-то вроде этого

 "act_mgr" : [{ "sales" : {"agent" : ["rohan@walkover.in","abc@walkover.in" ], "last_interacted" : "abc@walkover.in" } } ] 

Также, если я добавлю новый 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" } } ] 

Я не знаю, как добавить эти поля

Вы можете обновить встроенный документ «sales» внутри массива «act_mgr» со следующим оператором обновления:

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

Вы можете добавить встроенный документ, содержащий информацию о «разработчике», в массив следующим образом:

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

Документацию по модификаторам $ push и $ set можно найти в документации «Обновление»: http://www.mongodb.org/display/DOCS/Updating

Более подробную информацию о создании и обновлении встроенных документов с помощью Mongo db можно найти в документации под названием «Точечная нотация (« Достижение в объекты »)» http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects % 29

Информацию об обновлении встроенных документов с помощью позиционного оператора «$» можно найти в разделе «Оператор $ positional» в документации «Обновление».
http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

Предупреждение: обычно чаще всего встроенные документы соответствуют одной и той же структуре, так что отдельные встроенные документы можно ссылаться более легко. Хорошим примером этого является ваш массив продаж. каждый встроенный документ содержит те же ключи, «sno», «message» и «status»,

Однако встроенные документы внутри вашего массива «act_mgr» содержат разные ключи; первый содержит «продажи», а второй содержит «разработчика». Вместо этого, возможно, рассмотрим следующую структуру:

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

Теперь каждый внедренный документ содержит те же ключи, «title», «agent» и «last_interacted».

Вы можете обновить поддокументы с помощью следующей команды.

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

Надеемся, это позволит вам сделать обновления, которые вам нужны, и, возможно, дать вам немного пищи для размышлений о дизайне схемы. Удачи!