Mongodb部分小结

前言:近期使用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" }})

你可能感兴趣的:(Mongodb部分小结)