You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 16:46:27