MongoDB如何查询完全匹配指定数组的文档?
问题:MongoDB数组完全匹配查询需求
集合数据
[ { "_id": 1, "favorite": { "color": "red", "foods": { "fruits": "banana", "fastfood": [ "burger", "sandwich" ] } } }, { "_id": 2, "favorite": { "color": "green", "foods": { "noodles": "ramen", "fastfood": [ "fries", "burger", "corn dog" ] } } }, { "_id": 3, "favorite": { "color": "red", "foods": { "soup": "cream soup" } } } ]
当前使用的查询语句
db.collection.find({ "favorite.foods.fruits": "banana", "favorite.foods.fastfood": { "$all": [ "burger" ] } })
当前查询结果
[ { "_id": 1, "favorite": { "color": "red", "foods": { "fastfood": [ "burger", "sandwich" ], "fruits": "banana" } } } ]
需求说明
需要完全匹配favorite.foods.fastfood数组:数组的元素、数量(若需严格顺序则包含顺序)必须与查询条件完全一致,不满足则返回空结果。
解决方案
1. 原生MongoDB查询方案
场景1:严格匹配数组(元素、数量、顺序完全一致)
直接将目标数组作为查询条件即可,无需使用$all($all仅匹配包含指定元素的数组,不限制其他元素):
db.collection.find({ "favorite.foods.fruits": "banana", "favorite.foods.fastfood": ["burger"] })
执行后会返回空数组,因为原集合中没有fastfood严格等于["burger"]的文档,符合需求。
场景2:忽略顺序的完全匹配(元素相同、数量相同)
如果不需要限制顺序,只需数组包含所有指定元素且元素数量一致,可结合$all和$size:
db.collection.find({ "favorite.foods.fruits": "banana", "favorite.foods.fastfood": { "$all": ["burger"], "$size": 1 } })
$size限制数组长度为1,$all确保数组包含burger,最终同样返回空结果,符合需求。
2. Spring Data MongoDB的MongoTemplate方案
场景1:严格匹配数组(元素、数量、顺序一致)
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import java.util.Arrays; import org.bson.Document; // 构建查询条件 Query query = new Query(); query.addCriteria(Criteria.where("favorite.foods.fruits").is("banana")); query.addCriteria(Criteria.where("favorite.foods.fastfood").is(Arrays.asList("burger"))); // 执行查询 List<Document> result = mongoTemplate.find(query, Document.class, "collectionName");
场景2:忽略顺序的完全匹配(元素相同、数量相同)
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import java.util.Arrays; import org.bson.Document; // 构建查询条件 Query query = new Query(); query.addCriteria(Criteria.where("favorite.foods.fruits").is("banana")); query.addCriteria(Criteria.where("favorite.foods.fastfood") .all(Arrays.asList("burger")) .size(1)); // 执行查询 List<Document> result = mongoTemplate.find(query, Document.class, "collectionName");
内容的提问来源于stack exchange,提问作者Abhijit Mondal Abhi
相关产品推荐
相关产品推荐

