将数组内容过滤到包含 $concatArrays 的查询

2023-12-20

给定这个函数,我有一个正在查询的数据集。数据如下:

db.activity.insert(
    {
        "_id" : ObjectId("5908e64e3b03ca372dc945d5"),
        "startDate" : ISODate("2017-05-06T00:00:00Z"),
        "details" : [
            {
                "code" : "2",
                "_id" : ObjectId("5908ebf96ae5003a4471c9b2"),
                "walkDistance" : "03",
                "jogDistance" : "01",
                "runDistance" : "08",
                "sprintDistance" : "01"
            }
        ]
    }
)

db.activity.insert(
    {
        "_id" : ObjectId("58f79163bebac50d5b2ae760"),
        "startDate" : ISODate("2017-05-07T00:00:00Z"),
        "details" : [
            {
                "code" : "2",
                "_id" : ObjectId("58f7948fbebac50d5b2ae7f2"),
                "walkDistance" : "01",
                "jogDistance" : "02",
                "runDistance" : "09",
                "sprintDistance" : ""
            }
        ]
    }
)

使用这个函数,感谢 Neil Lunn,我能够得到我想要的输出:

db.activity.aggregate([
  { "$project": {
    "_id": 0,
    "unique": {
      "$filter": {
        "input": {
          "$setDifference": [
            { "$concatArrays": [ 
              "$details.walkDistance",
              "$details.jogDistance",
              "$details.runDistance",
              "$details.sprintDistance"
            ]},
            []
          ]
        },
        "cond": { "$ne": [ "$$this", "" ] }
      }
    }
  }},
  { "$unwind": "$unique" },
  { "$group": {
    "_id": null,
    "uniqueArray": { "$addToSet": "$unique" }  
  }}
])

但是,我无法在开头添加匹配语句。

db.activity.aggregate([
  {$match: {"startDate" : ISODate("2017-05-06T00:00:00Z"), "details.code": "2" },
  {$unwind: '$details'},
  {$match: {"startDate" : ISODate("2017-05-06T00:00:00Z"), "details.code": "2" },
  { "$project": {
    "_id": 0,
    "unique": {
      "$filter": {
        "input": {
          "$setDifference": [
            { "$concatArrays": [ 
              "$details.walkDistance",
              "$details.jogDistance",
              "$details.runDistance",
              "$details.sprintDistance"
            ]},
            []
          ]
        },
        "cond": { "$ne": [ "$$this", "" ] }
      }
    }
  }},
  { "$unwind": "$unique" },
  { "$group": {
    "_id": null,
    "uniqueArray": { "$addToSet": "$unique" }  
  }}
])

因为它给出了以下错误消息:

> $concatArrays only supports arrays, not string

我怎样才能修改这个查询以便$match可以添加声明吗?


Don't $unwind https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/您要输入的数组$concatArrays https://docs.mongodb.com/manual/reference/operator/aggregation/concatArrays/。而是申请$filter https://docs.mongodb.com/manual/reference/operator/aggregation/filter/仅提取匹配值。如上所述,我们可以使用$setUnion https://docs.mongodb.com/manual/reference/operator/aggregation/setUnion/对于“唯一串联”:

db.activity.aggregate([
  { "$match": { "startDate" : ISODate("2017-05-06T00:00:00Z"), "details.code": "2" } },
  { "$project": {
    "_id": 0,
    "unique": {
      "$let": {
        "vars": {
          "filtered": {
            "$filter": {
              "input": "$details",
              "cond": { "$eq": [ "$$this.code", "2" ] }
            }  
          }
        },
        "in": {
          "$setDifference": [
            { "$setUnion": [ 
              "$$filtered.walkDistance",
              "$$filtered.jogDistance",
              "$$filtered.runDistance",
              "$$filtered.sprintDistance"
            ]},
            [""]
          ]
        } 
      }
    }
  }},
  { "$unwind": "$unique" },
  { "$group": {
    "_id": null,
    "uniqueArray": { "$addToSet": "$unique" }  
  }}
])

Using $let https://docs.mongodb.com/manual/reference/operator/aggregation/let/使语法更加清晰,因为您不需要指定多个$map https://docs.mongodb.com/manual/reference/operator/aggregation/map/ and $filter https://docs.mongodb.com/manual/reference/operator/aggregation/filter/语句“内联”作为源$setUnion https://docs.mongodb.com/manual/reference/operator/aggregation/setUnion/

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

将数组内容过滤到包含 $concatArrays 的查询 的相关文章

  • 如何将后端计时器与移动应用程序同步

    我正在开发一个选择用户并有 15 秒时间的应用程序 该用户响应的计时器 用户应用程序每 5 秒查询一次数据库 以查看是否选择了该用户 如果是这样 移动应用程序将开始 15 秒 定时器 问题是计时器永远不会匹配 因为用户应用程序可以位于与后端
  • 将 Mongo 集合转储为 JSON 格式

    有没有办法将 mongo 集合转储为 json 格式 无论是在 shell 上还是使用 java 驱动程序 我正在寻找性能最好的一个 Mongo 包含一个 mongoexport 实用程序 参见文档 https docs mongodb c
  • 返回游标数组不显示任何结果

    我试图通过这样做来解决两个集合的 连接 foundUsers function var searchUser Session get searchUser user search criteria var usf User find sea
  • MongoDB 将通过 $lookup 聚合运算符使用分片

    lookup是 MongoDB 3 2 中的新增功能 它对同一数据库中的未分片集合执行左外联接 以从 联接 集合中过滤文档进行处理 To use lookup the from集合不能被分片 另一方面 分片是一种有用的水平扩展方法 一起使用
  • Mongoose __v 什么时候改变

    根据http aaronheckmann tumblr com post 48943525537 mongoose v3 part 1 versioning http aaronheckmann tumblr com post 489435
  • 如何使用打字稿在猫鼬模型中定义自定义查询助手?

    我想使用定义自定义查询助手查询助手 API https mongoosejs com docs guide html query helpers 这里是例子 models article ts import Document Schema
  • Symfony2 的 mongoDB 返回一个可记录游标而不是我的实体

    我目前使用 DoctrineMongoDbBundle 向我的 mongodb 数据库发出请求 这是我的控制器中的调用 dm this gt get doctrine odm mongodb document manager entitie
  • MongoDB 添加以变量值命名的新字段

    我的问题是 鉴于像这样的文件很少 deliveryDay 2021 01 14 plate name pasta quantity 1 deliveryDay 2021 01 16 plate name pasta quantity 3 d
  • 如何根据 node.js 中用户的输入创建 mongodb 查询?

    目前在我的应用程序中我存储了不同的论坛帖子 用户可以添加新消息并创建新帖子 其他用户在显示内容时可以对其进行过滤 这样他们就不会看到他们之前阻止的特定用户上传的内容 每个用户都表示为以下组合device id and display nam
  • 在mongo聚合中选择* group by

    我正在尝试做一些我认为很简单的事情 假设我在 mongo 中有一系列具有公共键和可变数量属性的记录 我想选择记录中的所有属性并按名称分组 例如 Name George x 5 y 3 Name George z 9 Name Rob x 1
  • 如何在 mongodb 中对数组进行 AND 查询?

    我有一个带有标签的数组 它是文档的一部分 例如 红 绿 蓝 白 黑 现在我想找到所有有红色和蓝色的文档 使用 all 条件查找同时匹配 红色 和 蓝色 条件的记录 db my collection find tags all red blu
  • 如何使用官方 MongoDB C# 驱动程序将 BsonDocument 转换为强类型对象?

    出于单元测试的目的 我想测试我的类映射 而无需在 MongoDB 数据库中读取和写入文档 为了处理特殊情况 例如循环父 子引用和只读属性 我使用了BsoncClassMap RegisterClassMap lt MyType gt 一些自
  • Mongoose 在结果的 _id 字段中返回“new ObjectId”

    当我尝试查询时 结果包含 id其中包含 new ObjectId 的字段 如何避免这种 new ObjectId 并仅将哈希值包含为字符串 由于此问题 将数据作为 JSON 响应发送回失败 下面是一个基本的demo 我的查询代码 book
  • Mongo中如何定义每个分片的分片范围?

    比方说 该文件是 x Number 我有 3 个碎片 除了自动分片之外 我可以具体定义 shard1 仅包含数据 x 你可以 可以手动预分割块 如下所述 http www mongodb org display DOCS Splitting
  • MongoDB db.collection.count() 与 db.collection.find().length()

    我想了解为什么这些命令在从mongos针对相同 MongoDB 集合的实例 返回不同的数字 db users count db users find length 原因是什么 这可能是潜在问题的征兆吗 我相信你的收藏已经被碎片化了 大多数分
  • mongodb对话系统

    我正在实施一个verymongodb 上的简单对话系统 这个想法应该是 当我打开一个 convo 时 它应该显示发送和接收的消息 到目前为止一切正常 并且应该非常容易 通过使用像这样的伪代码这样的简单查询 from my id AND to
  • node-mongodb-native MongoClient 意外关闭连接

    我一直在 mongodb 中搜索大量意外关闭的连接 但只能找到希望关闭连接的人提出的问题 我正在使用 node mongodb native 连接到数据库 但我不断收到看似随机的 错误 连接已关闭 消息 如果我手动重试请求 浏览器刷新 则请
  • mongoose node.js,使用 $lt 和 $gt 进行查询不起作用

    我想要获取最后分数在 15 到 20 之间的所有学生 为此 我使用 mongoose 在 mongoDB 中执行以下查询 模型工作正常 所有其他查询都正常 Pupils find marks 1 value lt 20 marks 1 va
  • 如何在Spring Boot中初始化一次MongoClient并使用它的方法?

    您好 我正在尝试导出MongoClient在 Spring Boot 中成功连接后 我尝试在其他文件中使用它 这样我就不必每次需要在 MongoDB 数据库中进行更改时都调用该连接 连接非常简单 但目标是将应用程序连接到我的数据库一次 然后
  • 在原子操作中测试和递减?

    我刚刚发现了一个恼人的错误 它基本上是一个竞争条件 为了便于论证 我们假设一个非常简单的文档结构 例如 id XXX amount 100 集合中存在数百个这样的文档 并且由多个编写器访问 这些编写器有效地尝试将数量降低任何值 但绝不会低于

随机推荐