MongoDB多条件查询:筛选同时含checkin和checkout值的邮箱
解决MongoDB筛选checkin和checkout数组存在对应值的文档问题
嘿,我来帮你搞定这个查询需求!首先得明确你说的“对应值”具体指哪种情况,我分两种常见场景给你解决方案:
场景1:匹配两个数组相同索引位置上的元素相等的文档
如果你要找的是某个文档里,checkin和checkout数组在同一个索引位置有完全相同的值(比如checkin[0]和checkout[0]相等,或者checkin[1]和checkout[1]相等),可以用$expr结合数组操作符来实现:
db.collection.find({ $expr: { $anyElementTrue: { $map: { input: { $range: [0, { $min: [{ $size: "$checkin" }, { $size: "$checkout" }] }] }, as: "idx", in: { $eq: [ { $arrayElemAt: ["$checkin", "$$idx"] }, { $arrayElemAt: ["$checkout", "$$idx"] } ] } } } } })
代码解释:
$min用来取两个数组长度的最小值,避免数组长度不一致时出现null比较的问题;$range生成从0到最小长度的索引列表;$map遍历每个索引,对比对应位置的checkin和checkout元素;$anyElementTrue只要有一个位置的元素相等,就会返回该文档。
场景2:匹配checkin数组中任意元素存在于checkout数组的文档
如果你只需要checkin里的某个值在checkout里出现过(不管位置),那这个查询更简单,用集合交集来判断:
db.collection.find({ $expr: { $ne: [ { $setIntersection: ["$checkin", "$checkout"] }, [] ] } })
代码解释:
$setIntersection计算两个数组的交集;$ne判断交集是否为空数组,如果不为空,说明两个数组有共同元素,就会筛选出该文档。
你可以根据自己的实际需求选择对应的查询语句,测试的时候记得替换成你的集合名称哦!
内容的提问来源于stack exchange,提问作者Nguyen
相关产品推荐
相关产品推荐

