node.js - 聚合在 mongo shell 中有效,但在节点中无效
问题描述
我正在尝试在 GraphQL 解析器中做一些非常简单的事情:将数据从一个集合转储到另一个集合。
这适用于 mongo shell
db.srcColl.aggregate([{$out: "foobarbaz"}])
这在节点中不起作用
db.collection("srcColl").aggregate([
{$out: "foobarbaz"}
])
没有错误被抛出,它只是没有做任何事情。
我在它之前和之后都有一个控制台日志,所以我知道它正在运行。我试过用 async/await 和回调来做这件事。
有谁知道为什么会发生这种情况?
mongodb v3.5.5
解决方案
此代码基于节点 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" }
推荐阅读
- typescript - 无法将 @core 安装到 Angular 11 项目
- azure - 有没有办法在 C# 的单个字段中映射两种不同的类型(字符串和字符串数组)?
- python - 为什么这个递归返回 0?
- c - C使用结构从C中的文本文件中读取记录
- hibernate-search - 使用 @IndexingDependency derivedFrom 和属性桥
- optimization - 如何在 R 中将无风险利率更改为我的投资组合优化(我正在使用投资组合分析包)?
- .net - 如何从 Azure DevOps Pipeline 上的构建解决方案步骤中排除项目
- reactjs - 如何正确管理多个视频播放器的状态?
- qt - 如何在 QT Web 程序集中返回值之前等待异步 lamda 函数完成
- batch-file - 批处理 - 每行读取第一行,然后读取第一个符号