MongoDB利用$elemMatch对内嵌文档进行多条件查询

目录

背景

内嵌文档单条件查询

多条件查询


背景

问题:遇到如下类型的数据,想要查询出所有文档中 满足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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值