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

求助, MongoDB 中查找如何做到完全匹配

  •  
  •   Rkls · 2021-12-08 10:46:27 +08:00 · 2300 次点击
    这是一个创建于 1089 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在 mongodb 中有如下数据
    {
    "_id":"111",
    "bgtime":"bgtime",
    "edtime":"edtime",
    "key1":"val1",
    "key2":"val2",
    "key3":"val3"
    }

    我写的程序对应的 shell 命令是
    db.coll.update(
    {
    "bgtime":{$exists:true},
    "edtime":{$exists:true},
    "key1":"val1",
    "key2":"val2"
    },
    {
    $set:
    {
    "bgtime":"bgtime",
    "edtime":"edtime",
    "key1":"val1",
    "key2":"val2"
    }
    },
    {
    $upsert:true
    })
    我想要获得的结果是一条数据中除了"_id"外只有查询条件的 4 个 key ,如果查不到的这样的 document 的话,将 update 中的文档插入,但是我写的过滤文档因为查到了数据库中的上述的数据,所以就不会再做插入了,现在有两个想法:
    1.先使用 find_many ( mongocxx 中的 api )找到所有匹配到的文档,然后去和我的键值对做匹配,但是这样工作量比较大
    2.在每次插入数据的时候都多插入一条 key 为_index 的字段,里面的 value 为"key1val (此处设计一个分隔符) key2val2",这样写查询条件的时候直接拼接_index 的 value 也是可以的。
    现在就是想看看 mongodb 有没有提供这样一种方法,直接做到完全匹配到我查询的文档
    6 条回复    2021-12-08 12:45:36 +08:00
    ch2
        1
    ch2  
       2021-12-08 11:16:06 +08:00
    使用 aggregate 聚合查询
    Rkls
        2
    Rkls  
    OP
       2021-12-08 11:40:41 +08:00
    @ch2 了解过 aggregate ,但是在$match 阶段后就不知道如何继续推进了,我去看下试试
    libook
        3
    libook  
       2021-12-08 11:52:29 +08:00
    "key3":{$exists:false}

    MongoDB 虽然可以插入任意结构的 document ,但是是在数据库操作本身不大关心 document 结构的基础上的,否则还是要有一个统一的 schema ,至少能清楚最多有哪些字段,你根据 schema 来梳理出不想要的字段,在查询条件里标明要求这些字段不存在的 document ,就可以了。
    Rkls
        4
    Rkls  
    OP
       2021-12-08 12:12:22 +08:00
    @libook 可是在实际的场景中 key 其实是文字,我需要处理的是传入的 map<string,string>,所以我其实并不清楚数据库中的 key 可能出现哪些字段,所以也就没办法使用"key3":{$exists:false},想要知道有 key3 的话,只有通过一次 find ,找到对应的所有_id,然后再比对是否有多余的 key 了
    Rkls
        5
    Rkls  
    OP
       2021-12-08 12:12:28 +08:00
    @libook 可是在实际的场景中 key 其实是文字,我需要处理的是传入的 map<string,string>,所以我其实并不清楚数据库中的 key 可能出现哪些字段,所以也就没办法使用"key3":{$exists:false},想要知道有 key3 的话,只有通过一次 find ,找到对应的所有_id,然后再比对是否有多余的 key 了
    libook
        6
    libook  
       2021-12-08 12:33:30 +08:00
    数据库的查询和索引机制是跟 key 强相关的,你可以去直接问 MongoDB 官方试试看有没有什么隐藏方法可以实现需求,个人经验来说,大多数据库从原理上都不支持这么做。
    Rkls
        7
    Rkls  
    OP
       2021-12-08 12:45:36 +08:00 via Android
    @libook 好的,多谢了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2580 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:48 · PVG 11:48 · LAX 19:48 · JFK 22:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.