V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐工具
RoboMongo
推荐书目
50 Tips and Tricks for MongoDB Developers
Related Blogs
Snail in a Turtleneck
cevincheung
V2EX  ›  MongoDB

应用全线替换到 MongoDb 可能会踩到什么坑?

  •  
  •   cevincheung · 2014-10-13 14:19:32 +08:00 · 10357 次点击
    这是一个创建于 3700 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在已经知道的:

    1.查询区分大小写
    譬如用户注册,填写的用户名。email可以强制转成小写。正则查询忽略大小写又有效率问题。
    2.sharedkey设置
    一旦设置不够合理,直接导致查询速度骤降
    3.查询索引前后顺序影响查询结果
    find({'key1':'value', 'field.key2': {'$in':[1,2,3]}}) key1,field.key2查询顺序调换后查询结果排序不一样。
    35 条回复    2015-05-14 16:20:18 +08:00
    tonghuashuai
        1
    tonghuashuai  
       2014-10-13 14:51:03 +08:00   ❤️ 1
    4.查询不存在的 collection 时不报异常
    ovear
        2
    ovear  
       2014-10-13 14:54:38 +08:00   ❤️ 1
    内存爆炸。。数据损坏。。
    advancedxy
        3
    advancedxy  
       2014-10-13 14:56:03 +08:00
    5. value 是 array 的时候不要插入太多的值.. 不然就等着插入速度直线下降.
    个人不太推荐全部用 MongoDB, 还是考虑用 PostgreSQL 吧..
    yueyoum
        4
    yueyoum  
       2014-10-13 14:57:39 +08:00
    5.如果事务对你很重要,就别考虑mongodb
    6.如果你的应用没有NB到mysql+好的表设计+正确的index+合理的sql查询语句+缓存都抗不住的话,还是没必要上mongodb
    7.嵌套的document,最好是增长不迅速的。如果嵌套的document体积增长迅速,mongodb会频繁的去开辟新的,更大的空间去把包含这个嵌套document的整个document都拷贝到新开辟的空间。
    8.实在是想不到有什么必须要上mongodb的理由,mysql+redis足以
    cevincheung
        5
    cevincheung  
    OP
       2014-10-13 15:10:50 +08:00
    @yueyoum
    @advancedxy

    主要是需要mongodb的geoindex功能。又不想mysql/mongodb都存一份。。。postgis尝试了N次没成功,感觉好复杂。
    wzxjohn
        6
    wzxjohn  
       2014-10-13 15:13:03 +08:00
    9. 配置不当导致外网可以非授权访问,数据库被Dump。
    wangfengmadking
        7
    wangfengmadking  
       2014-10-13 15:52:08 +08:00
    新手使用mongo说多了都是泪,(可能由于使用不当)查询效率巨慢。所以说,如果不是业务必须的,还是绕开mongo,使用其他的吧,坑太多了
    sharebox
        8
    sharebox  
       2014-10-13 16:31:05 +08:00
    最好不要只用一种数据库....

    综合考虑,选最合适的组合。
    yanze0613
        9
    yanze0613  
       2014-10-13 17:22:41 +08:00
    定时刷新数据到mysql,mongo单纯做内存数据库,感觉会比直接用好
    willwen
        10
    willwen  
       2014-10-13 17:26:12 +08:00 via iPhone
    爆內存,爆硬盤
    TimLang
        11
    TimLang  
       2014-10-13 17:30:41 +08:00
    做索引一定要加{backgoround:1}。。
    pythoner
        12
    pythoner  
       2014-10-13 18:15:50 +08:00
    10. 单机要扛不住了才想起做sharding
    lqs
        13
    lqs  
       2014-10-13 18:20:39 +08:00
    11. mongodb的geoindex当数据大了会特别慢。
    menway
        14
    menway  
       2014-10-13 19:21:25 +08:00
    12. 字段名称不能包含.和$
    13. 跨表查询
    est
        15
    est  
       2014-10-13 19:37:12 +08:00
    mongodb的索引必须全部放在内存中。如果索引大小超过内存,等着哭吧。。。
    kankana
        16
    kankana  
       2014-10-13 19:42:51 +08:00
    @yueyoum
    那个scheme不固定可以算一个使用理由不?
    你们都说得好恐怖啊... 我也是第一次用.
    TangMonk
        17
    TangMonk  
       2014-10-13 20:55:01 +08:00
    mysql好像有Spatial search啊
    vus520
        18
    vus520  
       2014-10-13 22:48:30 +08:00
    为什么你们都不提聚合查询真的好复杂~
    codeframe
        19
    codeframe  
       2014-10-13 23:08:18 +08:00
    查询结果集有个 16M 的限制;另外就是没法做多表的 join 操作;还有就是一旦数据库写满磁盘后,直接删数据是不会腾出硬盘空间的。
    fasling
        20
    fasling  
       2014-10-13 23:22:58 +08:00
    性能。
    我不是很懂,但据说数据量一大就慢。隔壁组还专门弄了个mysql来加速。
    liuchang0812
        21
    liuchang0812  
       2014-10-13 23:37:55 +08:00
    mongodb本来就是内存性的NoSQL数据库。。。上面说定期dump到mysql的。。。。你们完全可以用leveldb。。。。
    Cadina
        22
    Cadina  
       2014-10-14 01:50:46 +08:00
    可以试试用rethinkdb替代mongo
    cevincheung
        23
    cevincheung  
    OP
       2014-10-14 02:01:21 +08:00
    @Cadina 支持geo?
    dcoder
        24
    dcoder  
       2014-10-14 08:35:08 +08:00
    我看来,楼主说的 1,2,3 都不是坑呢
    cevincheung
        25
    cevincheung  
    OP
       2014-10-14 09:32:07 +08:00
    @TangMonk 感觉略坑,效率远不如mongodb
    mengzhuo
        26
    mengzhuo  
       2014-10-14 09:36:37 +08:00
    应该看应用场景吧

    游戏+mongodb/Redis天生一对
    MasterYoda
        27
    MasterYoda  
       2014-10-14 10:16:46 +08:00
    @yueyoum 看场景吧,LBS上mongodb就很正常了。但确实这东西比 MySQL + Redis 坑多。
    MasterYoda
        28
    MasterYoda  
       2014-10-14 10:19:16 +08:00
    @liuchang0812 leveldb直接用还是有点不爽啊。而且读多写少的话上也不合适。
    yueyoum
        29
    yueyoum  
       2014-10-14 11:08:58 +08:00
    @cevincheung
    @MasterYoda

    postgresql 支持 point 数据类型,也就是 可以直接存储 (1.23, 45.09) 这样的数据。
    刚好可以用作经纬度存储。

    配合 postgis 貌似也挺方便, 虽然我没弄过…………
    yueyoum
        30
    yueyoum  
       2014-10-14 11:12:10 +08:00
    @kankana

    确实 scheme 不固定,我在项目中也是感受到这点的方便,
    但感觉 postgresql 支持的json字段, 也是有这个好处啊。


    所以如果是要在新项目中,mongodb 和 postgresql 都可以选择的话,
    我个人倾向还是用 postgresql
    cevincheung
        31
    cevincheung  
    OP
       2014-10-14 12:23:08 +08:00
    @yueyoum postgis忒麻烦,尝试数次失败已经放弃了,用pgsql替代mysql,那我倒放心。

    现在正在尝试Solr GeoDist
    Cadina
        32
    Cadina  
       2014-11-27 17:12:59 +08:00
    @cevincheung 新版支持了
    cevincheung
        33
    cevincheung  
    OP
       2014-11-28 02:52:24 +08:00
    @Cadina 支持神马
    mathgl
        34
    mathgl  
       2014-12-08 22:41:40 +08:00
    一直用tokumx。 相当满意
    zlandjj
        35
    zlandjj  
       2015-05-14 16:20:18 +08:00
    @cevincheung redis貌似有个插件还是petch支持geo
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2932 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 03:04 · PVG 11:04 · LAX 19:04 · JFK 22:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.