首页 > 解决方案 > 聚合在 mongo shell 中有效,但在节点中无效

问题描述

我正在尝试在 GraphQL 解析器中做一些非常简单的事情:将数据从一个集合转储到另一个集合。

这适用于 mongo shell db.srcColl.aggregate([{$out: "foobarbaz"}])

这在节点中不起作用

db.collection("srcColl").aggregate([
    {$out: "foobarbaz"}
  ])

没有错误被抛出,它只是没有做任何事情。

我在它之前和之后都有一个控制台日志,所以我知道它正在运行。我试过用 async/await 和回调来做这件事。

有谁知道为什么会发生这种情况?

mongodb v3.5.5

更新:我制作了一个脚本和一个屏幕截图来显示整个问题。您可以看到它在节点中不起作用,但在 mongo 中起作用。 在此处输入图像描述

标签: node.jsmongodbnosqlaggregate

解决方案


此代码基于节点 mongodb 驱动程序网站上的聚合文档。 MongoDB NodeJS 3.6 驱动文档

注意:由于您在管道中使用了 $out 运算符,因此不会返回任何结果。您可以通过注释掉 $out 行来验证聚合是否正常工作。

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

// Connection URL
const url = 'mongodb://0.0.0.0:27017';

// Database Name
const dbName = 'dbname';

// Create a new MongoClient
const client = new MongoClient(url);

// 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('srcColl');
    collection.aggregate([
        //[{ '$match': { "borough": "Bronx" } },
        { '$out': 'foobazbar' },

    ],
        function (err, cursor) {
            assert.equal(err, null);

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

源集合:

> db.srcColl.find()
{ "_id" : ObjectId("5ec82abbed4a7db1b6d414fc"), "name" : "tom" }
{ "_id" : ObjectId("5ece58d6a61e6a47b8dd85cc"), "name" : "baz" }
{ "_id" : ObjectId("5ece58d95630d9f3b9aef91e"), "name" : "foo" }

运行上述代码后的目标集合:

> db.foobazbar.find()
{ "_id" : ObjectId("5ec82abbed4a7db1b6d414fc"), "name" : "tom" }
{ "_id" : ObjectId("5ece58d6a61e6a47b8dd85cc"), "name" : "baz" }
{ "_id" : ObjectId("5ece58d95630d9f3b9aef91e"), "name" : "foo" }

推荐阅读