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

mongodb 创建索引的实例

  •  
  •   aoscici2000 · 2019-11-06 21:05:57 +08:00 · 3915 次点击
    这是一个创建于 1846 天前的主题,其中的信息可能已经有所发展或是发生改变。

    刚学习数据库, 看文档有点半懂不懂的样, 伸手求一个实例以便能更好理解.

    假设文档如下

    {
        "_id": : "xxxxx",
        "title": "adidas 阿迪 T 恤 10010-20",
        "catalog": "运动",
        "brand": "阿迪达斯",
        "price": 199,
        "specs": [
            {
                "name": "材质",
                "value": "涤纶"
            },
            {
                "name": "上市",
                "value": "2019 秋季"
            }
        ]
    }
    

    如果我想要搜索 'T 恤', '运动', '阿迪达斯', '秋季', 这些词都能找到这条记录的话, 应该怎么创建索引?

    8 条回复    2019-11-07 10:44:10 +08:00
    fmumu
        1
    fmumu  
       2019-11-06 21:24:33 +08:00 via Android
    查记录和索引有啥关系?
    aoscici2000
        2
    aoscici2000  
    OP
       2019-11-06 21:39:47 +08:00
    @fmumu 啥? 那我要像这样同时查找多个 key 内有没有某个词的话, 岂不是要一条挺长的查询语句? 我还以为能简化出来拼凑在一起呢...
    yuikns
        3
    yuikns  
       2019-11-07 08:05:31 +08:00 via Android
    感觉你要的是 elasticsearch 吧
    至少稍微学习下它的定位哦
    JerryCha
        4
    JerryCha  
       2019-11-07 10:13:36 +08:00
    我觉得你可能需要专门建立一个 tag 字段储存关键词。
    MongoDB 有 text 索引可以支持模糊搜索,不过一个 collection 只能建一个。你这分散在各个字段的有点困难。
    460881773
        5
    460881773  
       2019-11-07 10:37:54 +08:00
    {
    "_id" : ObjectId("5dc375c0acbff831b828a906"),
    "_class" : "plus.ojbk.web.controller.test",
    "title" : "adidas 阿迪 T 恤 10010-20",
    "catalog" : "运动",
    "brand" : "阿迪达斯",
    "price" : 199,
    "specs" : [
    {
    "name" : "材质",
    "value" : "涤纶"
    },
    {
    "name" : "上市",
    "value" : "2019 秋季"
    }
    ]
    }






    db.getCollection('test_a').find({ "$or" : [ { "title" : { "$regex" : "^.*秋季.*$" , "$options" : "i"}} , { "catalog" : { "$regex" : "^.*秋季.*$" , "$options" : "i"}} , { "brand" : { "$regex" : "^.*秋季.*$" , "$options" : "i"}} , { "specs" : { "$elemMatch" : { "value" : { "$regex" : "^.*秋季.*$" , "$options" : "i"}}}}]})
    aoscici2000
        6
    aoscici2000  
    OP
       2019-11-07 10:39:03 +08:00
    @yuikns 差不多, 也去了解了下, 但感觉数据量很少, 没什么必要
    460881773
        7
    460881773  
       2019-11-07 10:39:24 +08:00
    ```
    String search ="秋季";
    Query query = new Query();
    Criteria criteria = new Criteria();
    Pattern pattern = Pattern.compile("^.*" + search + ".*$", Pattern.CASE_INSENSITIVE);
    query.addCriteria(
    criteria.orOperator(
    Criteria.where("title").regex(pattern),
    Criteria.where("catalog").regex(pattern),
    Criteria.where("brand").regex(pattern)
    ,Criteria.where("specs").elemMatch(Criteria.where("value").regex(pattern))
    )
    );
    System.err.println(query);
    List<test> a = mongoTemplate.find(query, test.class);
    System.err.println(a);

    ```
    aoscici2000
        8
    aoscici2000  
    OP
       2019-11-07 10:44:10 +08:00
    @JerryCha 想过, 但感觉某些字段需要更新的话貌似也挺麻烦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1063 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:41 · PVG 03:41 · LAX 11:41 · JFK 14:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.