Возможный дубликат:
Поля обновления 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"}})
Надеемся, это позволит вам сделать обновления, которые вам нужны, и, возможно, дать вам немного пищи для размышлений о дизайне схемы. Удачи!