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

聚合请求MongoDB

卢光誉
2023-03-14

我想在带有条件的集合列表中获得多个字段。我尝试了一个聚合请求,但我有一个错误。

我的请求

db.people.aggregate({$match:{createddate:{$exists:true},“ad”:“noc2”}},{$group:{value2:$value2}});

我的Json:


    db.test.findOne();
{
        "_id" : ObjectId("51e7dd16d2f8db27b56ea282"),
        "ad" : "noc2",
        "list" : {
                "p45" : {
                        "id" : "p45",
                        "date" : ISODate("2014-01-01T12:18:30.568Z"),
                        "value3" : 21,
                        "value1" : 100,
                        "value2" : 489
                },
                "p6" : {
                        "id" : "p6"
                        "date" : ISODate("2013-07-18T12:18:30.568Z"),
                        "value3" : 21,
                        "value1" : 100,
                        "value2" : 489
                },
                "p4578" : {
                       "id" : "4578"
                        "date" : ISODate("2013-07-18T12:18:30.568Z"),
                        "value3" : 21,
                        "value1" : 100,
                        "value2" : 489
                }
        }
}

例如,我想在result中获得这个json:

{id:p45,value:587},{id:p4578,value:47},{id:p6,value:2}

共有1个答案

耿锦
2023-03-14

示例文档和聚合有几个问题:

  • 示例文档将与您的聚合查询不匹配,因为您匹配的是createddate字段已存在
  • $group()运算符在文档级别上工作,需要_id字段来分组
  • 您的列表字段是嵌入式文档,而不是数组
  • 除了格式化之外,没有明显的方法将示例值与您要查找的计算结果相关联

下面是一个经过调整的示例文档,其中列表是一个数组,并且每个项目都有一些唯一的值,这些值恰好与您提到的数字相加:

db.people.insert({
        "ad" : "noc2",
        "createdDate" : ISODate(),
        "list" : [
                {
                        "id" : "p45",
                        "date" : ISODate("2014-01-01T12:18:30.568Z"),
                        "value3" : 21,
                        "value1" : 77,
                        "value2" : 489
                },
                {
                        "id" : "p6",
                        "date" : ISODate("2013-07-18T12:18:30.568Z"),
                        "value3" : 20,
                        "value1" : 20,
                        "value2" : 7
                },
                {
                       "id" : "4578",
                        "date" : ISODate("2013-07-18T12:18:30.568Z"),
                        "value3" : 21,
                        "value1" : 300,
                        "value2" : -319
                }
        ]
})

现在可以使用$Unwind运算符提取匹配的子文档。

从当前的问题描述中不清楚您试图实现什么$group操作,以及您是否实际需要$group

下面是使用聚合框架为每个列表项$add(total)的三个值的示例:

db.people.aggregate(

    // Find relevant docs (can use index if available)
    { $match: {
        createdDate: { $exists:true },
        "ad":"noc2"
    }},

    // Convert list array to stream of documents
    { $unwind: "$list" },

    // Add  (value1, value2, value3) for each list item 
    { $project: {
        _id: "$list.id",
        value: { $add: [ "$list.value1", "$list.value2", "$list.value3"] }
    }}
);

示例输出:

{
    "result" : [
        {
            "_id" : "p45",
            "value" : 587
        },
        {
            "_id" : "p6",
            "value" : 47
        },
        {
            "_id" : "4578",
            "value" : 2
        }
    ],
    "ok" : 1
}

注意,在本例中,我只使用了一个文档进行聚合,输出的结果文档将是list数组中的每个项的一个结果文档。

在实际使用中,您可能希望通过文档_id或其他一些条件向$group添加一个附加的聚合步骤,这取决于您试图实现的结果。

 类似资料:
  • 设置您的本地环境 步骤1: 复制 步骤2: 构建 步骤3: 分支 进行更改 步骤4: 编写代码 步骤5: 提交更改 提交代码说明的指导 步骤6:变基 步骤7: 测试 步骤8: 推送代码 步骤9: 新建一个合并代码请求 步骤10: 讨论和更新 批准和请求更改工作流程 步骤11: 执行合并 持续集成测试 设置您的本地环境 步骤1: 复制 在 GitHub 上复制项目到你的账号并把项目克隆到本地。 $

  • GitLab可以引用提交消息中的特定问题来解决特定的问题。 在本章中,我们将讨论如何在GitLab中引用问题: 步骤(1): 要引用问题,您需要创建问题的问题编号。 要创建问题,请参阅创建问题章节。 步骤(2): 要查看创建的问题,请单击Issues选项卡下的List选项: 步骤(3): 在对本地存储库进行更改之前,请使用以下命令检查它是否为最新版本: 命令从远程服务器下载最新的更改并直接集成到当

  • 主要内容:合并请求的步骤合并请求可用于对项目其他人员之间所做的代码进行交换,与他们讨论更改。 合并请求的步骤 步骤(1): 在创建新的合并请求之前,应该在GitLab中创建一个分支。 您可以参考本章创建分支: 步骤(2): 登录到您的GitLab帐户并转到项目部分下的项目: 步骤(3): 点击选项卡,然后点击New merge request 按钮: 步骤(4): 要合并请求,请从下拉列表中选择源分支和目标分支,然后单击

  • Django数据库抽象API描述了使用Django查询来增删查改单个对象的方法。然而,你有时候会想要获取从一组对象导出的值或者是聚合一组对象。这份指南描述了通过Django查询来生成和返回聚合值的方法。 整篇指南我们都将引用以下模型。这些模型用来记录多个网上书店的库存。 from django.db import models class Author(models.Model): na

  • 第一个名为的文档包含以下文档(不包括): 第二个集合名为,具有以下文档: 上的 预期的结果是: 如何使用聚合查询来实现这一点?

  • 我正在尝试设置一个搜索查询,该查询应通过多级嵌套字段复合聚合集合,并从该集合中提供一些子聚合指标。我能够按预期使用其存储桶获取复合聚合,但所有存储桶的子聚合指标都带有。我不确定我是否未能正确指出子聚合应考虑哪些字段,或者它是否应放置在查询的不同部分中。 我的收藏看起来类似于以下内容: 贝娄,你可以找到我已经尝试了。尽管所有文档都有一个设置的点击值,但所有存储桶都带有点击总数。 到目前为止,我的回应