聚合在mongo shell中起作用,但在node中不起作用

时间:2020-05-22 19:55:17

标签: node.js mongodb nosql aggregate

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

这在mongo shell中有效 db.srcColl.aggregate([{$out: "foobarbaz"}])

这在Node中不起作用

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

没有引发任何错误,它什么也没做。

前后都有一个控制台日志,所以我知道它正在运行。我试图用异步/等待以及回调来做到这一点。

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

mongodb v3.5.5

更新:我制作了一个脚本和一个屏幕截图以显示整个问题。您可以看到它在节点中不起作用,但在mongo中起作用。 enter image description here

2 个答案:

答案 0 :(得分:0)

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

注意:由于您在管道中使用了$ 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" }

答案 1 :(得分:0)

我已经接受了dJackson的回答,但总而言之,我错过了toArray()

所以不是

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

我只需要

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