Mongodb mongo中的匹配和平均值保持为空
我使用控制台执行聚合,使用$match检查嵌套字段是否存在,然后推送到group和$avg操作符。然而,匹配在同一个变量上可以正常工作,count代码也可以正常工作,但是当涉及到平均值时,我每次都返回null 我在数组中查找第一个元素,例如.0,然后在字段中查找该元素。这是非常复杂和难以调试的。有什么建议吗?Distinct显示我查看的值都是数字afaik。对于如何调试这个有什么建议吗Mongodb mongo中的匹配和平均值保持为空,mongodb,Mongodb,我使用控制台执行聚合,使用$match检查嵌套字段是否存在,然后推送到group和$avg操作符。然而,匹配在同一个变量上可以正常工作,count代码也可以正常工作,但是当涉及到平均值时,我每次都返回null 我在数组中查找第一个元素,例如.0,然后在字段中查找该元素。这是非常复杂和难以调试的。有什么建议吗?Distinct显示我查看的值都是数字afaik。对于如何调试这个有什么建议吗 db.b.aggregate([ {$match: {"x.x.x.0.x": {$exists: true}
db.b.aggregate([ {$match: {"x.x.x.0.x": {$exists: true} } }, {$group: {_id: null, myAvg: { $avg: "$x.x.x.0.x"}}}])
结果:
{ "_id" : null, "myAvg" : null }
这似乎是聚合框架的一个限制,即您可以在哪里实际使用
“array.n”
符号来访问数组的第n个元素
更准确地说,鉴于以下示例文档:
db.test.insertOne({
"a" : [
{
"x" : 1.0
}
]
})
…您可以执行以下操作来检索“a”
数组的第一个元素与1
匹配的所有文档:
db.test.aggregate({
$match: {
"a.0.x": 1
}
})
但是,您不能运行以下操作:
db.test.aggregate({
$project: {
"a0x": "$a.0.x"
}
})
可以,但它将返回一个空数组,如下所示,这确实有点令人惊讶:
{
"_id" : ...,
"a0x" : []
}
但是,在这种情况下,有一个特殊的操作员访问第n个元素,如下所示:
db.test.aggregate({
$project: {
"a0x": { $arrayElemAt: [ "$a.x", 0 ] },
}
})
请注意,这将仅返回第n个元素-因此不再嵌套在数组中:
{
"a0x" : 1.0
}
所以你可能想做的是:
db.b.aggregate({
$group: {
_id: null,
myAvg: {
$avg: {
$arrayElemAt: [ "$x.x.x.x", 0 ]
}
}
}
})
这似乎是聚合框架的一个限制,即您可以在哪里实际使用
“array.n”
符号来访问数组的第n个元素
更准确地说,鉴于以下示例文档:
db.test.insertOne({
"a" : [
{
"x" : 1.0
}
]
})
…您可以执行以下操作来检索“a”
数组的第一个元素与1
匹配的所有文档:
db.test.aggregate({
$match: {
"a.0.x": 1
}
})
但是,您不能运行以下操作:
db.test.aggregate({
$project: {
"a0x": "$a.0.x"
}
})
可以,但它将返回一个空数组,如下所示,这确实有点令人惊讶:
{
"_id" : ...,
"a0x" : []
}
但是,在这种情况下,有一个特殊的操作员访问第n个元素,如下所示:
db.test.aggregate({
$project: {
"a0x": { $arrayElemAt: [ "$a.x", 0 ] },
}
})
请注意,这将仅返回第n个元素-因此不再嵌套在数组中:
{
"a0x" : 1.0
}
所以你可能想做的是:
db.b.aggregate({
$group: {
_id: null,
myAvg: {
$avg: {
$arrayElemAt: [ "$x.x.x.x", 0 ]
}
}
}
})
你能试着隔离问题并粘贴简化数据模型吗?你能试着隔离问题并粘贴简化数据模型吗?在数组的元素中,有一个字典,我如何才能将该字段取出?你能发布一个示例文档吗?在数组的元素中,有一个字典,我怎样才能把那个字段拿出来?你能不能发一份样本文档?