我有一个包含数组 Private Function GetCurrentTime(ByVal dtnew As String) As DateTime
Dim oaDate As DateTime
Dim timeValue As DateTime
Dim dtNow As DateTime
'Final date time to be stored in the time field
oaDate = DateTime.FromOADate(0)
dtnew = String.Concat(oaDate.Year, oaDate.Month, oaDate.Day, dtnew)
dtnew = dtnew.Replace(":", String.Empty)
dtNow = DateTime.ParseExact(dtnew, "yyyyMMddHHmm", Globalization.CultureInfo.InvariantCulture) 'Convert.ToDateTime(dtnew).ToString("HH:mm")
timeValue = dtNow 'New DateTime(oaDate.Year, oaDate.Month, oaDate.Day, dtNow.Hour, dtNow.Minute, dtNow.Second)
Return timeValue
End Function
和字段an_array
的集合。数组可以由值组成(数组可能为空),它也可以存在于a_field
中。
我想创建一个汇总函数,该函数汇总a_field
或a_field
中的值数。
编辑:例如我想计算an_array
和1
等a_field
使用an_array
的次数。
例如,如果我有一些看起来像这样的文件:
{
a_field: 1,
an_array: [ 1, 3, 4 ],
},
{
a_field: 3,
an_array: [],
}
{
a_field: 2,
an_array: [ 1 ],
}
我希望看到这样的输出:
[ { _id: 1, a_count: 1, b_count: 2 }, { _id: 2, a_count: 1, b_count: 0 }, { _id: 3, a_count: 1, b_count: 1 }, { _id: 4, a_count: 0, b_count: 1 } ]
但是我得到这样的输出:
[ { _id: 1, a_count: 1, b_count: 2 }, { _id: 3, a_count: 1, b_count: 1 }, { _id:4, a_count: 1, b_count: 1 } ]
哪个不正确,因为它缺少_id
2,而_id
4的计数太多。
我面临的问题是,当an_array
为空时,如果数组为空,我将无法正确检索所有计数,并且它获得的a_count
的值不是#39; t始终与实际ID匹配(如_id
4中所示)。
到目前为止我所拥有的是:
db.getCollection('test').aggregate( [
{ $match: {
a_field: {
$ne: null
}
} },
{ $group: {
_id: '$a_field',
a_count: {
$sum: 1
},
an_array: {
$push: {
an_array: '$an_array'
}
}
} },
{ $project: {
an_array: 1,
a_count: 1
} },
{ $unwind: '$an_array' },
{ $unwind: '$an_array.an_array' },
{ $group: {
_id: '$an_array.an_array',
b_count: {
$sum: 1
},
a_count: {
$first: '$a_count'
}
} },
] );
我真的很感激一些意见,因为我喜欢在一个单一的聚合中做到这一点。在这一点上,这已成为一种个人追求,而不是实际的实施。谢谢!
编辑:我现在已经绑定到MongoDB 2.6了。
答案 0 :(得分:1)
使用$size
作为数组字段,这是你幸运的男孩v2.6的新功能!
此外,我不明白为什么你想要尝试计算$a_field
- 因为它不是一个数组而总是会成为一个元素 - 所以这个聚合只包括$a_field
作为结果中_id
的内容。您知道$a_field
的计数始终为1
,因为它不是数组:
db.test.aggregate([{
$match: {
a_field: {
$ne: null
}
}
}, {
$group: {
_id: '$a_field',
an_array_size: {
$size: '$an_array'
}
}
}])
控制台输出示例:
> db.test.find({});
{
"_id": ObjectId("57ada868700ca97222421d8b"),
"a_field": 1,
"an_array": [1, 3, 4]
}
> db.test.aggregate([{
$match: {
a_field: {
$ne: null
}
}
}, {
$group: {
_id: '$a_field',
an_array_size: {
$size: '$an_array'
}
}
}])
{
"result": [{
"_id": 1,
"an_array_size": 3
}],
"ok": 1
}