Mongodb 中一些复杂用法
update
- 向数组字段添加多个元素,使用$push + $each 命令
举例
旧数据:{ "_id" : "30e087ee5fff301a96e04ad15999ed16", "recvlist" : [ "30e087ee5fff301a96e04ad15999ed16" ]}
命令: db.user_friend.update({"_id" : "30e087ee5fff301a96e04ad15999ed16"},{$push: {recvlist: {$each: ["xx","yy"]}}}) -> 如果push单个的话,直接使用:{$push: {recvlist: "xx"}} 就可以
结果:{ "_id" : "30e087ee5fff301a96e04ad15999ed16", "recvlist" : [ "30e087ee5fff301a96e04ad15999ed16", "xx", "yy" ]}
更新子文档中的数组也是一样的操作,只需要将“recvlist” 替换成子文档。例如有以下子文档:
{ "_id" : "30e087ee5fff301a96e04ad15999ed16", "chilid": {"recvlist" : [ "30e087ee5fff301a96e04ad15999ed16" ]}}
使用以下命令即可
db.user_friend.update({"_id" : "30e087ee5fff301a96e04ad15999ed16"},{$push: {"child.recvlist": {$each: ["xx","yy"]}}})
特别注意:"child.recvlist" 一定要将引号,不然会报错
- 从数组字段删除多个元素,使用$pull + $in 命令
举例
旧数据:{ "_id" : "30e087ee5fff301a96e04ad15999ed16", "recvlist" : [ "30e087ee5fff301a96e04ad15999ed16", "xx", "yy" ]}
命令: db.user_friend.update({"_id" : "30e087ee5fff301a96e04ad15999ed16"},{$pull: {recvlist: {$in: ["xx","yy"]}}}) -> 如果pull单个的话,直接使用:{$pull: {recvlist: "xx"}} 就可以
结果:{ "_id" : "30e087ee5fff301a96e04ad15999ed16", "recvlist" : [ "30e087ee5fff301a96e04ad15999ed16"]}
- 更新子文档中数组中的某一个元素值
举例,假如要将 emails.0.accessory.itemid 为10001的,emails.0.accessory.status改为19
旧数据:{ "_id" : "30e087ee5fff301a96e04ad15999ed333", "emails" : { "0" : { "accessory" : [ { "itemid" : 10001, "count" : 1, "status" : 0} ] } } }
命令: db.user_email.update({"_id" : "30e087ee5fff301a96e04ad15999ed333", "emails.0.accessory.itemid":10001}, {$set: {"emails.0.accessory.$.status": 19}}, true)
结果:{ "_id" : "30e087ee5fff301a96e04ad15999ed333", "emails" : { "0" : { "accessory" : [ { "itemid" : 10001, "count" : 1, "status" : 19} ] } } }
注意以上更新命令中在status前面有一个 $ 号
- 根据条件删除子文档中数组的元素
举例,假如要将 emails.0.accessory.itemid 为10001 的记录删除
旧数据:{ "_id" : "30e087ee5fff301a96e04ad15999ed333", "emails" : { "0" : { "accessory" : [ { "itemid" : 10001, "count" : 1, "status" : 0} ] } } }
命令:db.user_email.update({"_id" : "30e087ee5fff301a96e04ad15999ed33"}, {$pull: {"emails.0.accessory": {"itemid": 10001}}})
结果:{ "_id" : "30e087ee5fff301a96e04ad15999ed333", "emails" : { "0" : { "accessory" : [] } } }
- 根据条件删除子文档数据(unset)
举例,假如要将 emails.0 的记录删除
旧数据:{ "_id" : "30e087ee5fff301a96e04ad15999ed333", "emails" : { "0" : { "accessory" : [ { "itemid" : 10001, "count" : 1, "status" : 0} ] } } }
命令:db.user_email.update({"_id" : "30e087ee5fff301a96e04ad15999ed33"}, {$unset: {"emails.0":""}})
结果:{ "_id" : "30e087ee5fff301a96e04ad15999ed333", "emails" : { } }