MongoDB常用操作总结
字段为map对象
map对象中的key的访问与嵌套字段的访问类似,用“.”符号;
db.request.update(
{"_id":ObjectId("57838820445de820d091d3ee")},
{"$set":{"auditorsubmits.zl":true}, "$addToSet":{records:{stateid:3}, holders:"z"}}
)
//records,holders都为数组类型字段
aggregate操作结果为数组
输入如下命令:
db.process.aggregate(
{"$match":{"admins.users":"zhangle"}},
{$project:{"perms":"$admins.perms", _id:0}}
)
返回结果如下:
{
"perms" : [
{
"roleid" : 18,
"role" : "OP",
"groupid" : 2,
"group" : "op-rd"
}
]
}
在golang中实现用如下代码:
pipeline := []bson.M{
{"$match": bson.M{"_id": bson.ObjectIdHex(processId)}},
{"$project": bson.M{"perms": "$admins.perms", "_id": 0}},
}
res := bson.M{}
err = c.Pipe(pipeline).One(&res)
//取出perms数组,并做类型([]interface{})转换
ps, _ := res["perms"].([]interface{})
for _, v := range ps {
//每个数组元素都为bson.M对象,转换类型
p, _ := v.(bson.M)
//类型转换,第二个返回值表明是否成功转换。
//在此忽略,只是防止转换失败时,进程panic; 这样即使转换失败,转换的结果(如roleId)也可以正常获取该类型的“零值”。
roleId, _ := p["roleid"].(int)
role, _ := p["role"].(string)
groupId, _ := p["groupid"].(int)
group, _ := p["group"].(string)
}
mongdo自增”_id”
该对象为ObjectId类型,在shell中查询时需要带上类型转换:
db.process.find({_id:ObjectId("578758d261656e4ea2373bce")}, {name:1, _id:0})
结果如下:
{ "name" : "op财务审批" }
在golang程序下则如下表达:
c.FindId(bson.ObjectIdHex(id)).One(data)
该id转换成string:
r := bson.M{}
profile.Id = r["_id"].(bson.ObjectId).Hex()
向数组类型字段添加一次性添加多个元素
//holders为数组类型,hs也为数组
err = c.UpdateId(
bson.ObjectIdHex(requestId),
bson.M{"$addToSet": bson.M{"holders": bson.M{"$each": hs}}})
同时更新多个字段(数组及非数组类型)
err = c.UpdateId(
bson.ObjectIdHex(requestId),
bson.M{
"$set": bson.M{//以下为非数组类型字段
"curstateid": nextStateId,
"curstatetype": newStateType,
"curstatename": newStateName,
"curgrouptype": newGroupType,
"auditorsubmits": newAuditors,
},
//向数组中添加单个值
"$addToSet": bson.M{
"records": *record,
"holders": auditor,
},
},
)
删除数组中的元素
//admins为数组类型字段,users为数组类型
err = c.UpdateId(
bson.ObjectIdHex(processId),
bson.M{"$pullAll": bson.M{"admins": users}},
)