如何根据嵌入数组过滤文档?

2023-12-08

审核后这一页,特别是这个查询

db.scores.find(
   { results: { $elemMatch: { $gte: 80, $lt: 85 } } }
)

我使用了以下导入

import static com.mongodb.client.model.Filters.and;
import static com.mongodb.client.model.Filters.elemMatch;
import static com.mongodb.client.model.Filters.eq;
import static com.mongodb.client.model.Projections.excludeId;
import static com.mongodb.client.model.Projections.fields;
import static com.mongodb.client.model.Projections.include;

并想出了以下代码来执行类似的操作(ARRAY_FIELD_NAME = "myArray")

MongoCollection<Document> collection = mongoDB.getCollection(COLLECTION_NAME);

Bson filters = and(eq("userId", userId), elemMatch(ARRAY_FIELD_NAME, eq("id", id)));
Bson projections = fields(include(ARRAY_FIELD_NAME), excludeId());

List<Document> results = (List<Document>) collection.find(filters).projection(projections).first().get(ARRAY_FIELD_NAME);
if (CollectionUtils.isEmpty(results)) {
    return null;
}
if (results.size() > 1) {
    throw new ApiException(String.format("Multiple results matched (User ID: %s, Array item ID: %s)", userId, id));
}
return results.get(0);

过滤具有以下结构的文档

{
    "_id": {
        "$oid": "588899721bbabc26865f41cc"
    },
    "userId": 55,
    "myArray": [
        {
            "id": "5888998e1bbabc26865f41d2",
            "title": "ABC"
        },
        {
            "id": "5888aaf41bbabc3200e252aa",
            "title": "ABC"
        }
    ]
}

但不是从myArray领域,我总是得到这两个项目!

唯一对我有用的代码如下

MongoCollection<Document> collection = mongoDB.getCollection(COLLECTION_NAME);

List<Bson> aggregationFlags = new ArrayList<>();
aggregationFlags.add(new Document("$unwind", "$" + ARRAY_FIELD_NAME));
aggregationFlags.add(new Document("$match", new Document("userId", userId).append(ARRAY_FIELD_NAME + ".id", id)));
aggregationFlags.add(new Document("$project", new Document("_id", 0).append(ARRAY_FIELD_NAME, "$" + ARRAY_FIELD_NAME)));

return (Document) collection.aggregate(aggregationFlags).first().get(ARRAY_FIELD_NAME);

那么,为什么第一段代码的行为应该与问题开头显示的查询相同,而不是按预期过滤结果?

我不需要“聚合”结果,我需要使用用户 ID 和数组项 ID 来“过滤”它们。


你需要使用$elemMatch(投影)。像下面这样的东西应该有效。

import static com.mongodb.client.model.Projections.elemMatch;

Bson filters = and(eq("userId", userId));
Bson projections = fields(elemMatch(ARRAY_FIELD_NAME, eq("id", id)), excludeId());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据嵌入数组过滤文档? 的相关文章

随机推荐

  • 如何使用 hibernate 和 Legacy 数据库修剪 char 字段 pojo 中的空格

    我的表的列为 char 5 无法将其更改为 varchar 5 因此 当我使用 hibernateTemplate 从表中获取值时 它会返回带有实际的单个字母值的添加空格 客户修复是使用 trim 方法检查 NPE 但是我们是否有提供的方法
  • SQL 迭代所有表

    我正在运行以下代码以从具有特定列的所有表中提取所有相关行 外层IF应该检查该迭代的表中是否存在该列 如果没有 它应该完成该迭代并移至下一个表 如果表中有GCRecord列 然后应该检查该表是否会返回任何记录 如果没有要返回的记录 则应结束该
  • data.table 中 cumsum 的平均版本(累积平均值)

    我有一些数据 library data table set seed 42 dat lt data table t 1 6 group rep 1 2 each 3 val runif 6 0 1 gt dat t group val 1
  • 如何在c中打印内存位

    我正在学习数字在内存中的表示方式 我想知道如何在内存中打印某些 int 和 float 变量的实际表示形式 二进制或十六进制 例如 我想看看当添加或减去这些数字导致溢出时会发生什么情况 如何访问内存并打印它 您需要将指向相关变量的指针分配给
  • Java 在文本区域右侧显示文本

    我遇到的问题ComponentOrientation RIGHT TO LEFT是 或 等字符或者 显示在左侧 我只需要从右到左绘制文本 但使用标准 西方 英语从左到右的文本字符表示法 如果不手动渲染文本 这可能吗 我无法生成您的问题 您可
  • 将 Jackson 注释添加到 swagger 生成的类

    我正在使用 swagger 来定义与我的网络服务器的合同 在 swagger 文件中 我定义了 REST 端点和请求 响应对象 我想添加注释 JsonInclude Include NON NULL 到我的招摇班级的一个领域 swagger
  • 动态包含安全

    有没有什么方法可以安全地包含页面而不将它们全部放入数组中 if preg match a z0 9 GET page page GET page php tpl GET page html if file exists page inclu
  • 如何使用 AJAX 进行重定向?

    我有以下代码 function get login hideshow loading2 1 error 0 ajax type POST url The URL data logins serialize dataType json suc
  • 即使用户强制关闭服务,如何自动重新启动服务?

    我希望服务在我的应用程序中始终运行 所以我想重新启动它 即使它被用户强制关闭 肯定有办法做到这一点 就像 Facebook 等应用程序正在做的那样 这不是使用推送通知完成的 即使互联网关闭 Facebook 也会重新启动其服务 首先 它是真
  • 绘制靠近折线的线

    我有一个三角形作为折线 我想绘制一个高度 我发出命令 line or line 正确的点 但 AutoCAD 绘制从顶点到相邻顶点的线 不仅在 AutoLISP 中 AutoCAD 也不允许我在多段线中绘制从顶点到边的中间的线 我怎样才能做
  • 使用 fuzzywuzzy 在数据框中创建一列匹配结果

    我遇到了使用 FuzzyWuzzy 库将所有 结果存储在数据框列中的挑战 我猜它可能需要循环 我一整天都在摸索这个问题 现在我想看看你们谁能帮我解决问题 会超级有帮助的 作为我想做的一个例子 这里有 2 个数据框表 主表 ID ITEM 1
  • 将数据附加到 S3 对象

    假设我有一台机器 我希望能够将其写入存储在 S3 存储桶上的某个日志文件 因此 机器需要具有对该存储桶的写入能力 但是 我不希望它能够覆盖或删除该存储桶中的任何文件 包括我希望其写入的文件 所以基本上 我希望我的机器能够仅将数据附加到该日志
  • 当没有数据类型可以容纳完整数字时将十六进制转换为十进制

    我正在使用 C 语言的 PIC 微处理器 它是 16F 因此它不能保存大于 32 位的整数 无符号int32是可用的最大数据大小 我从阅读器处收到一个 5 字节的 ID 代码 为了传输它 我必须逐位编码为 BCD 我无法将其冲刺为字符串 因
  • 使用 JavaScript 检测 NPAPI 支持

    如何从 JavaScript 检测浏览器是否支持 NPAPI 并非所有人都这样做 虽然我可以依赖用户代理 但如果存在的话 我宁愿采用一种更可靠的方式来实现 不幸的是 我无法简单地检测我的插件是否已加载 因为该插件可能尚未安装在支持的浏览器上
  • Playframework - Eclipse 无法检测到新模板[重复]

    这个问题在这里已经有答案了 可能的重复 如何让Eclipse看到Play中的变化 编译模板 我正在迈出 Play 的第一步 框架和我遇到了一些问题 我可以毫无问题地创建和消除一个项目 现在 如果我添加一个新视图 例如 sometest sc
  • 登录 Azure Web 应用程序失败,并显示“AADSTS50079:用户需要使用多重身份验证”

    我们有一个 Azure Web 应用程序 它通过 Azure 多因素身份验证进行身份验证并访问 Graph API 和 Power BI 我们已经设置了 Azure 应用程序注册所需的权限 我们使用 Redis 缓存将令牌详细信息存储在 N
  • Yii 2.0 Restful Web 服务 API

    有人使用 Yii 2 0 beta 中集成的 RESTful Web 服务吗 官方的说明文档看起来很简单 但对我来说不起作用 我正在使用基本模板 使用 gii 模块创建一个简单的 类别 模型扩展ActiveRecord 然后我创建了Cate
  • Ansible:如何增加IP地址?

    我将一个变量传递给 Ansible extra vars lan 10 10 10 1 我现在需要增加这个 IP 地址 以便最后一个八位字节是 2所以它将等于10 10 10 2 在 Ansible 中如何实现这一点 从 Ansible 2
  • SQL WHERE 子句中的加号是什么意思 (WHERE + userName = SYSTEM_USER)

    我一直在试图找到 where 子句中加号的含义 有人对此有什么想法吗 被卡住了一点 查询本身非常简单 无论有或没有加号 其工作方式都类似 我想删除它 除非它的存在是有原因的 SELECT userID from tblUser WHERE
  • 如何根据嵌入数组过滤文档?

    审核后这一页 特别是这个查询 db scores find results elemMatch gte 80 lt 85 我使用了以下导入 import static com mongodb client model Filters and