Ale*_*lex 6 mongodb mongodb-query aggregation-framework
我开始学习MongoDB并使用这样的文档:
{
"_id" : ObjectId("562fac8a4f9ecec40f5b8ff9"),
"foo" : {
"objectid" : "39",
"stuff" : "65"
},
"yearpublished" : [
"1979"
],
"bar": "1263"
}
Run Code Online (Sandbox Code Playgroud)
yearpublished是一个数组,我想按照这个数组中的第一个值对我的集合进行分组,然后计算相关文档的数量.
我已经做了这个查询:
db.foobar.aggregate(
[
{
$group : {
_id : '$yearpublished',
count: { $sum: 1 }
}
}
]
)
Run Code Online (Sandbox Code Playgroud)
得到:
{
"result" : [
{
"_id" : [
"1923"
],
"count" : 1.0000000000000000
},
{
"_id" : [
"1864"
],
"count" : 1.0000000000000000
}
}
Run Code Online (Sandbox Code Playgroud)
但我正在寻找这种结果(即仅第一个元素):
{
"result" : [
{
"_id" : "1923,
"count" : 1.0000000000000000
},
{
"_id" : "1864",
"count" : 1.0000000000000000
}
}
Run Code Online (Sandbox Code Playgroud)
我试过_id : { $first: '$yearpublished.0' },或 _id : { $first: '$yearpublished[0]' },没试过 .
你知道我可以通过数组yearpublished的第一个元素进行分组吗?
不幸的是,现在唯一的方法是$first在处理后从数组中提取元素$unwind.那么你当然要$group再次:
db.foobar.aggregate([
{ "$unwind": "$yearpublished" },
{ "$group": {
"_id": "$_id",
"yearpublished": { "$first": "$yearpublished" }
}},
{ "$group": {
"_id": "$yearpublished",
"count": { "$sum": 1 }
}}
])
Run Code Online (Sandbox Code Playgroud)
这是从阵列中获取"第一"元素的唯一当前方法,通过解构它并使用运算符来获取条目.
未来的版本将$arrayElemAt通过索引在一个阶段内完成:
db.foobar.aggregate([
{ "$group": {
"_id": { "$arrayElemAt": [ "$yearpublished", 0 ] },
"count": { "$sum": 1 }
}}
])
Run Code Online (Sandbox Code Playgroud)
但是目前聚合框架并没有处理"点符号"索引的使用,例如标准的"投影"与.find()do,而不会,因此新的操作.
| 归档时间: |
|
| 查看次数: |
3129 次 |
| 最近记录: |