目录
背景
问题:遇到如下类型的数据,想要查询出所有文档中 满足members中任意一条的name以"Bule"开头且其中的gender为"M" 的文档。
// collection: test
{
"_id" : ObjectId("5fc4646a2b7bfb044c042e52"),
"id" : 1,
"members" : [
{
"name" : "BuleRiver1",
"age" : 27,
"gender" : "M"
},
{
"name" : "manager2",
"age" : 23,
"gender" : "F"
},
{
"name" : "manager3",
"age" : 21,
"gender" : "M"
}
]
}
首先准备测试数据:
db.test.insert(
{
"id": 1, "members":
[
{ "name": "BuleRiver1", "age": 27, "gender": "M" },
{ "name": "manager2", "age": 23, "gender": "F" },
{ "name": "manager3", "age": 21, "gender": "M" }]
});
内嵌文档单条件查询
先说一下这种内嵌文档单条件查询的解决思路,假设我们只查询name为固定值或者name需要满足某个正则,那么如下语句已经能够满足我们的需求:
db.test.find({"members.name":"BuleRiver1"});
正则写法:
db.test.find({"members.name":{"$regex":"Bule*"}});
特别注意的是,用下列语句,完全匹配内嵌文档中的一个值的时候也能获取到结果,也可以拿到匹配结果 但是 不建议这么处理,我们知道能拿到匹配结果即可。因为实际的项目开发中,字段可能多达上百:
db.test.find({"members":{"name":"BuleRiver1", "age":27, "gender":"M"}});
同时我们试一下单条件查询的别的情况,看能不能成功,
以下语句拿不到匹配的文档:
db.test.find({"members":{"name":"BuleRiver1"}});
键值颠倒,也拿不到匹配的文档:
db.test.find({"members":{"age":27, "name":"BuleRiver1", "gender":"M"}});
多条件查询
由简单到困难,我们再来看内嵌文档的多条件查询,首先按照上面的方式如法炮制,看下是否ok
db.test.find({"members.name":"BuleRiver1", "members.age":27});
拿到了匹配结果,我们再换一下条件,来确定上面查询的是或还是与的返回结果,
db.test.find({"members.name":"BuleRiver1", "members.age":23});
这一句也拿到了返回结果,那么问题来了,至少这种语句,不是我们所希望的且(与)的效果。
到这里我们需要用到$elemMatch操作符,
db.test.find({"members":{"$elemMatch":{"name":"BuleRiver1", "age":27}}});
这种语句可以查询出结果
db.test.find({"members":{"$elemMatch":{"name":"BuleRiver1", "age":23}}});
这样的语句查询不出来,再把语句修改一下,加上正则匹配即可。
db.test.find({
"members":
{
"$elemMatch":
{ "name": { $regex: "BuleRiver*" }, "gender": { $regex: "M" } }
}
});
筛选数组中所有数据都满足条件的文档
https://blog.csdn.net/weixin_42348333/article/details/115555965
参考:
https://blog.csdn.net/tree_ifconfig/article/details/81540000