前言:近期使用mongodb的频率比较高,其中遇见一些坑,作此总结!本人mongo为3.4版本。
首先触雷多次的是mongo对象的遍历问题,之前使用过程中没有发现这个问题。
mongo对象只可遍历一次!
帅帅跟我说要想多次遍历就先转为数组,嗯,是个好方法!
然后就是一些小的技巧和小代码:
索引及中文排序
建立索引
如果没有对应的数据库,会自定创建,索引可加快查询速度:
a,mongodb新建collection 包含索引,且中文排序(在创建数据库时使用)
db.dbname.createIndex({name: 1}, {collation: {locale: "zh"}})
注:name字段加索引,1为正向,-1为反向。
b,查询时按中文拼音排序
db.dbname.find({"查询条件"}).collation({'locale':'zh'}).sort([("attr_name1", 1), ('attr_name2', 1)])
其他:
1,查询array中包含某键值对的对象:
{
"_id" : ObjectId("xxxxxxxx"),
"name" : "ccc",
"room_items" : [
{
"room_ref" : "aaa",
"room_name" : "shuaishuai"
},
{
"room_ref" : "bbb",
"room_name" : "room_name"
}
]
}
查询room_items数组中包含"room_name": "shuaishuai"的所有对象:
db.dbname.find({"room_items":{$elemMatch: { "room_name": "shuaishuai"}}})
2,查询mongo对象中存在某数组的对象:
db.dbanme.find({"_id": ObjectId("xxxxxxx"), "room_items": {"$exists": True}})
注:True 为存在,False为不存在(python 的true false 首字母大写)
3,将字典对象添加到array:
room_ob = {"name":"room1","ref":"xxxx"}
db.dbname.update({"_id": ObjectId("")}, {"$addToSet": {"room_items": room_ob}})
注:$addToSet 重复不添加(如果多个键值对相同但顺序不同,会认为是不同字典,这是一个坑)
4,更新数组中某个字典对象的部分值:
db.userinfo.update(
{
"_id" : ObjectId("xxxxxx"),
"room_items": { "$elemMatch": { "room_ref": "aaa" } } },
{ "$set": { "room_items.$.room_type" : 6, "room_items.$.room_name":"room1" }
})
注:修改room_items数组中“room_ref”为"aaa"的对象的“room_type”及“room_name”值
5,删除数组中的内嵌字典文档
db.dbname.update({"_id": ObjectId(xxxx)},{"$pull":{"room_items":{"room_name": room1}}}
小结:目前使用的值得记录的大概这么多,以后再追加!
6,对正则的支持
db.common.find({"name":{"$regex": '^%s' % "ab" }})
等同
commons = Common.objects.raw({"name":{"$regex": '^%s' % "ab" }})
网友评论