Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 嵌入数组的MongoDB平均值作为额外字段_Javascript_Node.js_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Javascript 嵌入数组的MongoDB平均值作为额外字段

Javascript 嵌入数组的MongoDB平均值作为额外字段,javascript,node.js,mongodb,mongodb-query,aggregation-framework,Javascript,Node.js,Mongodb,Mongodb Query,Aggregation Framework,我的文档如下所示: { "_id" : "53ce85eda2579da8b40c1f0f", "name" : "Autokino", "tags" : [ "forMen" ], "ratings" : [ { "rating" : 5, "uuid" : "..."}, { "rating" : 4, "uuid" : "..."}, { "rating" : 4, "uuid" : "

我的文档如下所示:

{
    "_id" : "53ce85eda2579da8b40c1f0f",
    "name" : "Autokino",
    "tags" : [
        "forMen"
    ],
    "ratings" : [
        { "rating" : 5, "uuid" : "..."},
        { "rating" : 4, "uuid" : "..."},
        { "rating" : 4, "uuid" : "..."},
        { "rating" : 1, "uuid" : "..."},
    ]
}
activities.aggregate([
    { $match: { _id: ObjectID(req.params.id) } },
    { $unwind: '$ratings' },                                                                                                                                                                          
    { $group: {
        _id: '$_id',
        rating: { $avg: '$ratings.rating'},
    }},
]);
现在我需要ratings.rating的平均值(这里应该是3.5)。我的查询如下所示:

{
    "_id" : "53ce85eda2579da8b40c1f0f",
    "name" : "Autokino",
    "tags" : [
        "forMen"
    ],
    "ratings" : [
        { "rating" : 5, "uuid" : "..."},
        { "rating" : 4, "uuid" : "..."},
        { "rating" : 4, "uuid" : "..."},
        { "rating" : 1, "uuid" : "..."},
    ]
}
activities.aggregate([
    { $match: { _id: ObjectID(req.params.id) } },
    { $unwind: '$ratings' },                                                                                                                                                                          
    { $group: {
        _id: '$_id',
        rating: { $avg: '$ratings.rating'},
    }},
]);
这是可行的,但我得到的是:

{
  "_id" : "53ce85eda2579da8b40c1f0f",
  "rating" : 3.5
}
这就是我需要得到的:

{
    "_id" : "53ce85eda2579da8b40c1f0f",
    "name" : "Autokino",
    "tags" : [
        "forMen"
    ],
    "rating" : 3.5
}
(原始文档没有评级数组,但具有评级平均值)

如何解决这个问题?

管道阶段类似于和是“绝对”的,因为只发出声明的字段。你需要另一个接线员。将做:

由于使许多文档脱离了数组内容的非规范化,因此您可以在此处使用
$first
,只取未聚合的附加字段的“first”匹配项

如果您担心有很多字段需要这样声明,MongoDB 2.6确实提供了变量。它的使用和输出可能不是您真正想要的:

activities.aggregate([
    { "$match": { "_id": ObjectID(req.params.id) } },
    { "$project": {
        "_id": "$$ROOT",
        "ratings": 1
    }},
    { "$unwind": "$ratings" },                                                                                                                                                                          
    { "$group": {
        "_id": "$_id",
        "rating": { "$avg": "$ratings.rating" },
    }},
]);
这会给你一些类似的东西:

{
    "_id" : {
        "_id": "53ce85eda2579da8b40c1f0f",
        "name" : "Autokino",
        "tags" : [
            "forMen"
        ],
        "ratings" : [
            { "rating" : 5, "uuid" : "..."},
            { "rating" : 4, "uuid" : "..."},
            { "rating" : 4, "uuid" : "..."},
            { "rating" : 1, "uuid" : "..."},
        ]
    },
    "rating": 3.5
}

这里没有问题,因为按
\u id
分组与对整个文档进行分组相同。因此,您可以始终添加一个最终的
$project
,以返回到类似的状态。但是这里没有通配符。

我也只是浏览了整个歌曲和舞蹈,最后不得不重新添加所有字段。不理想

所以我发现这更简单:我有一个reviews数组字段,它的rating属性为1-5

{
      $addFields: { avg: { $avg: '$reviews.rating'}}
},

我的文档很大,有很多字段,有什么东西可以让我访问hole文档吗?@dkoch在MongoDB 2.6中有
$$ROOT
变量,但它只会分配给一个字段,即使它是当前管道阶段的所有文档。您仍然需要一个最终的
$project
,才能恢复原始结构。MongoDB查询都是数据结构。事实上,to应该生成它们,而不是硬编码它们。unwind不起作用,因为$ratings在projection@dkoch第二个列表中的输入错误。举个例子,你知道我希望这不是一个实用的方法。一个用于聚合函数,一个用于正常查找。