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

2021-12-08 10:46:27 +08:00
 Rkls
现在 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 有没有提供这样一种方法,直接做到完全匹配到我查询的文档
2115 次点击
所在节点    MongoDB
6 条回复
ch2
2021-12-08 11:16:06 +08:00
使用 aggregate 聚合查询
Rkls
2021-12-08 11:40:41 +08:00
@ch2 了解过 aggregate ,但是在$match 阶段后就不知道如何继续推进了,我去看下试试
libook
2021-12-08 11:52:29 +08:00
"key3":{$exists:false}

MongoDB 虽然可以插入任意结构的 document ,但是是在数据库操作本身不大关心 document 结构的基础上的,否则还是要有一个统一的 schema ,至少能清楚最多有哪些字段,你根据 schema 来梳理出不想要的字段,在查询条件里标明要求这些字段不存在的 document ,就可以了。
Rkls
2021-12-08 12:12:22 +08:00
@libook 可是在实际的场景中 key 其实是文字,我需要处理的是传入的 map<string,string>,所以我其实并不清楚数据库中的 key 可能出现哪些字段,所以也就没办法使用"key3":{$exists:false},想要知道有 key3 的话,只有通过一次 find ,找到对应的所有_id,然后再比对是否有多余的 key 了
Rkls
2021-12-08 12:12:28 +08:00
@libook 可是在实际的场景中 key 其实是文字,我需要处理的是传入的 map<string,string>,所以我其实并不清楚数据库中的 key 可能出现哪些字段,所以也就没办法使用"key3":{$exists:false},想要知道有 key3 的话,只有通过一次 find ,找到对应的所有_id,然后再比对是否有多余的 key 了
libook
2021-12-08 12:33:30 +08:00
数据库的查询和索引机制是跟 key 强相关的,你可以去直接问 MongoDB 官方试试看有没有什么隐藏方法可以实现需求,个人经验来说,大多数据库从原理上都不支持这么做。
Rkls
2021-12-08 12:45:36 +08:00
@libook 好的,多谢了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/820812

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX