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

如何使用mongodb聚合返回字符串数组

东方化
2023-03-14

我需要返回带有mongoDB聚合的字符串数组。我做了以下操作:

db.users.aggregate([{$group: {_id:"$emails.address"}}])

它返回:

{ "_id" : [ "a@a.com" ] }
{ "_id" : [ "b@a.com" ] }
{ "_id" : [ "c@a.com" ] }

有没有一种方法可以返回像这样的字符串数组:

["a@a.com","b@a.com","c@a.com"]

非常感谢任何花时间帮助我的人。。

编辑

添加数据

{
    "_id" : "ukn9MLo3hRYEpCCty",
    "createdAt" : ISODate("2015-10-24T03:52:11.960Z"),
    "emails" : [
        {
            "address" : "a@a.com",
            "verified" : false
        }
    ]
}
{
    "_id" : "5SXRXraariyhRQACe",
    "createdAt" : ISODate("2015-10-24T03:52:12.093Z"),
    "emails" : [
        {
            "address" : "b@a.com",
            "verified" : false
        }
    ]
}
{
    "_id" : "WMHWxeymY4ATWLXjz",
    "createdAt" : ISODate("2015-10-24T03:52:12.237Z"),
    "emails" : [
        {
            "address" : "c@a.com",
            "verified" : false
        }
    ]
}

共有2个答案

刘翔宇
2023-03-14

布莱克七的回答是对的。

这个aggregate()方法始终返回对象,无论您做什么,这些对象都无法更改。

但是,这并不意味着不能将它们放入数组中,然后将数组返回到对象中。

我相信在数据库本身的数组中映射会更好,因为您的节点服务器仍然可以用于其他请求。

db.users.aggregate([
     { "$unwind": "$emails" },
     { "$group": { "_id": null, emails:{$push:"$emails.address"} } },
     { "$project":{emails:true,_id:false}}
 ])

这将返回:

{ "emails" : [ "a@a.com", "b@a.com", "c@a.com" ] }
庾和昶
2023-03-14

<代码>。aggregate()方法始终返回对象,无论您执行什么操作,并且这些操作无法更改。

出于您的目的,您最好使用。相反,它只返回一个不同值的数组:

db.users.distinct("emails.address");

这正是您想要的输出:

["a@a.com","b@a.com","c@a.com"]

如果您真的想使用.聚合(),那么对值的转换需要在后处理中发生在表达式的“外部”。在处理这样的数组时,您还应该使用$unWind

您可以使用JavaScript实现这一点。map()例如:

db.users.aggregate([
    { "$unwind": "$emails" },
    { "$group": { "_id": "$emails.address" } }
]).map(function(el) { return el._id })

它给出了相同的输出,但是。map()在客户端而不是服务器上进行转换。

 类似资料:
  • 本文向大家介绍如何获取 MongoDB 聚合中的子字符串,包括了如何获取 MongoDB 聚合中的子字符串的使用技巧和注意事项,需要的朋友参考一下 要获取子字符串,请在MongoDB中使用$substr。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是在MongoDB聚合中获取子字符串的查询- 这将产生以下输出-

  • 我有一个函数,当某些条件不满足时,它应该不返回任何内容(void)或字符串。 我也试过这句话。左(无效)

  • 我想执行一个进行基本分页的聚合查询: 查找属于某个 以下是查询的详细信息: 这将查找所有匹配的文档: 这对文档进行了排序: 这会对文档进行计数,并传递未修改的文档,但我肯定这样做是错误的,因为事情从这里开始变得很奇怪: 这似乎跳过了一些文档: 这本应限制文件,但却没有: 这会返回计数,但不会返回数组中的文档,而是返回每个字段的数组: 结果是: 我哪里弄错了?

  • 问题内容: 我正在从Java程序的Delphi编译的* .so文件中调用函数。经过研究后,JNA似乎是他的路要走。在深入研究一些复杂的Delphi代码之前,我尝试使用一些“ Hello World”代码,但是在获取由Delphi函数返回的字符串时遇到了麻烦。 Delphi代码(helloworld.pp): 我从命令行使用“ fpc -Mdelphi helloworld.pp ” 编译它,生成

  • 我在mongodb 4.0中使用Spring(boot)数据2.2.7。我已经设置了3个集合,试图通过聚合查找操作加入这些集合。 目录 股票 操作 目录 映射由 股票 映射由 productId字段引用目录集合中的_id字段 操作 映射由 组件ID字段指的是库存集合中的_id 我想查询操作或库存收集,以检索相应的节点或组件对象列表,该列表由Product.model字段(在目录集合中)排序。) 虽

  • 问题内容: 好的,这就是我的for子手游戏代码,我唯一要做的就是让我的程序将其中一个单词随机化,这应该在方法中成功完成。但是我唯一的问题是让String变量 “ word” 返回到主类(在主类中的所有 “ word” 变量下面都有错误)。 如果我可以通过这种方法获得另一种帮助,或者从列表中产生随机单词的另一种方法,那将是惊人的。 问题答案: 在Java中,参数是通过值而不是引用传递的。因此,您不能