6 mongodb mongodb-query aggregation-framework
我需要返回mongodb聚合的字符串数组.我做了以下事情:
db.users.aggregate([{$group: {_id:"$emails.address"}}])
Run Code Online (Sandbox Code Playgroud)
它返回:
{ "_id" : [ "a@a.com" ] }
{ "_id" : [ "b@a.com" ] }
{ "_id" : [ "c@a.com" ] }
Run Code Online (Sandbox Code Playgroud)
有没有办法像这样返回字符串数组:
["a@a.com","b@a.com","c@a.com"]
Run Code Online (Sandbox Code Playgroud)
非常感谢任何花时间帮助我的人
编辑
添加数据:
{
"_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
}
]
}
Run Code Online (Sandbox Code Playgroud)
Bla*_*ven 15
无论你做什么,该.aggregate()方法总是返回Objects,并且不能改变.
为了您的目的,您可能最好使用.distinct(),而只返回不同值的数组:
db.users.distinct("emails.address");
Run Code Online (Sandbox Code Playgroud)
这正是您想要的输出:
["a@a.com","b@a.com","c@a.com"]
Run Code Online (Sandbox Code Playgroud)
如果你真的想要使用.aggregate()那么转换到只需要在后处理中表达式"外部"的值.$unwind在处理像这样的数组时你也应该使用它.
您可以使用JavaScript执行此操作,.map()例如:
db.users.aggregate([
{ "$unwind": "$emails" },
{ "$group": { "_id": "$emails.address" } }
]).map(function(el) { return el._id })
Run Code Online (Sandbox Code Playgroud)
它提供相同的输出,但是.map()转换客户端而不是服务器端.
什么布雷克七已经回答是正确的。
无论您做什么,并且不能更改,.aggregate()方法始终返回Object。
但是,这并不意味着您不能将它们放入数组中并在对象中返回该数组。
我相信数据库本身在数组中的映射会更好,因为您的节点服务器仍可用于其他请求。
db.users.aggregate([
{ "$unwind": "$emails" },
{ "$group": { "_id": null, emails:{$push:"$emails.address"} } },
{ "$project":{emails:true,_id:false}}
])
Run Code Online (Sandbox Code Playgroud)
这将返回:
{ "emails" : [ "a@a.com", "b@a.com", "c@a.com" ] }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14124 次 |
| 最近记录: |