使用NodeJS的MongoDB平均聚合

时间:2020-07-15 09:35:40

标签: node.js mongodb

大家下午好。

我在MongoDB文档中有一个数组。我不会在其中找到一个Volume并在Volume参数上对整个集合取平均值。

MongoDB中的文档:

MongoDB screen

如您所见,我在数组内部有数组。我将有很多相同类型的文档,并且需要在Volume参数的每个文档之间进行平均计算。

问题代码区域(仅展示我的尝试,这不起作用。

function simplePipeline(db, callback) {
    const collection = db.collection('ADABTC');
    collection.aggregate(
        [
            { '$group': { 'Volume': { '$avg': 'Array.Volume' } } }
        ],
        function(err, cursor) {
            assert.equal(err, null);

            cursor.toArray(function(err, documents) {
                console.log(documents)
                callback(documents);
            });
        }
    );
}

以防万一,例如,我可以连接到数据库username:password

如何指定NodeJS?

NodeJS完整代码

const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');

// Connection URL
const url = 'mongodb://username:password@ip.adress.port/<dbname>?retryWrites=true&w=majority';

// Database Name
const dbName = 'Crypto';

// Create a new MongoClient
const client = new MongoClient(url, { useUnifiedTopology: true });

// Use connect method to connect to the Server
client.connect(function(err, client) {
    assert.equal(null, err);
    console.log("Connected correctly to server");

    const db = client.db(dbName);

    simplePipeline(db, function() {
        client.close();
    });
});

function simplePipeline(db, callback) {
    const collection = db.collection('ADABTC');
    collection.aggregate(
        [
            { '$group': { 'Volume': { '$avg': 'Array.Volume' } } }
        ],
        function(err, cursor) {
            assert.equal(err, null);

            cursor.toArray(function(err, documents) {
                console.log(documents)
                callback(documents);
            });
        }
    );
}

1 个答案:

答案 0 :(得分:1)

您的$group语法是错误的:

按照指定的_id表达式对输入文档进行分组,并针对每个不同的分组输出文档。

$group阶段必须指定一个_id字段。将整个集合分组,只需在其中放置任何常量即可。

{
    '$group': {
        _id: null,
        'Volume': {
            '$avg': '$Array.Volume'
        }
    }
}