当前位置: 首页 > 知识库问答 >
问题:

如何修复MongoDB聚合$project$筛选器

郑声
2023-03-14

我有如下数据:

{
  "_id" : 1,
  "data" : [
    {
      "id" : 1,
      "one" : [
        {"user" : 2, "two" : 2},
        {"user" : 1, "two" : 3}
      ]
    }
  ]
}
{
  "_id" : 2,
  "data" : [
    {
      "id" : 2,
      "one" : [
        {"user" : 2, "two" : 2},
        {"user" : 1, "two" : 3}
      ]
    }
  ]
}

我希望在聚合中进行过滤(因为上面的数据来自前几个阶段),以便过滤一个数组,只显示一个数组项,其中用户等于_id。

以下返回空一个数组,如何让过滤器填充一个数组,因为我期望?

db.parks.aggregate([{$project: {_id: 1, 'data.id': 1, 'data.one':
{$filter: {
  input: '$data.one',
  as: 'un',
  cond: {$eq: ['$$un.user', '$_id']}}
}}}]).pretty()

其中:

{ "_id" : 1, "data" : [ { "id" : 1, "one" : [ ] } ] }
{ "_id" : 2, "data" : [ { "id" : 2, "one" : [ ] } ] }

将“$\u id”替换为“$$un”。“用户”显示所有数据。其中一项与预期的一样,因此问题似乎出现在$eq语句中。

如何让过滤器显示一个数组,因为我期望?

共有1个答案

红富
2023-03-14

您可以使用下面的聚合

db.collection.aggregate([
  { "$project": {
    "data": {
      "$filter": {
        "input": {
          "$map": {
            "input": "$data",
            "in": {
              "id": "$$this.id",
              "one": {
                "$filter": {
                  "input": "$$this.one",
                  "as": "on",
                  "cond": { "$eq": ["$$on.user", "$_id"] }
                }
              }
            }
          }
        },
        "as": "d",
        "cond": { "$eq": ["$$d.id", "$_id"] }
      }
    }
  }}
])

蒙古游乐场

 类似资料:
  • 我需要筛选此查询,以便不显示值为的文档。当前,我的代码显示以下结果: 我需要一些过滤器,使消失,以便它显示我作为第一个值:。 我以前执行过以下操作:

  • 我在mongodb中有一个非常大的项目集合,其模式无法更改。简化版的样子是这样的: 集合非常大,我无法首先提取应用程序中的所有ip地址,然后计算每个ip地址的事件。 这能用地图/缩小吗。你有什么建议?

  • 我有一种情况,我需要根据一个数组值执行一个group by操作,该数组值将字段值的出现次数相加。然后对计数进行过滤,并准备结果,以便根据条件显示结果。从本质上讲,文档被转换回如果您只使用find函数就会呈现的方式。由于matchedDocuments数组中收集的项的数量,我遇到了临时文档太大的问题。任何关于如何改进这一点的建议都将是有益的。 以下是一些示例文档和基于上述标准的预期结果:

  • 我有以下问题:我正在学习如何使用MongoDb和C#。可以在集合中插入项,但无法筛选现有集合以检索一个或多个符合查询条件的项。下面是我的类结构: 下面是我保存对象的方法: 并且正确保存了对象,正如您在图像中所看到的: 但是如何检索包含id为1234的对象事务的文档呢? 我使用的是.NET Core2和MongoDb C#驱动程序版本2.5。 编辑:集合是BsonDocument集合,它不是Tran

  • 我想过滤掉字段'a'等于'a'的文档,同时我想对字段'a'进行刻面处理,当然不包括前面的过滤器。我知道您可以将筛选器放在查询的“外部”,以便在不应用该筛选器的情况下获得方面,例如: 弹性搜索 索尔尔 也就是说,对于方面A,我希望保留除A:A以外的所有过滤器,对于方面B,我希望保留除B:B以外的所有过滤器,以此类推。最明显的方法是执行n个查询(n个方面中的每一个),但我不想这样做。

  • 在https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filter-aggregation.html我们了解到: 以上代码显示了我们如何为t恤添加aggs,但我们如何做到: 和