求助, MongoDB 中查找如何做到完全匹配 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Rkls
V2EX    MongoDB

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

  •  
  •   Rkls 2021-12-08 10:46:27 +08:00 2640 次点击
    这是一个创建于 1402 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在 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     Solana     3983 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 04:10 PVG 12:10 LAX 21:10 JFK 00:10
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86