所以我不太了解MongoDB
。我RoboMongo
使用它连接到 MongoDB。我需要做的是——在那个 MongoDB 中有一个集合。我想从该集合中导出数据,以便将其保存到文件中。
我使用该界面将集合中的数据作为文本打开,然后执行Ctrl+A并粘贴到文本文件中。但是,我发现并非所有数据都被复制,而且文本数据中有很多注释自然会破坏 JSON。
我想知道 RoboMongo 是否有Export As JSON
设施让我可以进行干净的出口。
任何指针表示赞赏!
您可以在MongoDB shell 脚本tojson
中使用将每条记录转换为 JSON 。
在 RoboMongo 中运行此脚本:
var cursor = db.getCollection('foo').find({}, {});
while(cursor.hasNext()) {
print(tojson(cursor.next()))
}
这会将所有结果打印为类似 JSON 的数组。
结果并不是真正的 JSON!某些类型(例如日期和对象 ID)被打印为 JavaScript 函数调用,例如ISODate("2016-03-03T12:15:49.996Z")
.
对于大型结果集可能不是很有效,但您可以限制查询。或者,您可以使用mongoexport
.
Robomongo 的 shell 功能将解决这个问题。就我而言,我需要几列作为 CSV 格式。
var cursor = db.getCollection('Member_details').find({Category: 'CUST'},{CustomerId :1,Name :1,_id:0})
while (cursor.hasNext()) {
var record = cursor.next();
print(record.CustomerID + "," + record.Name)
}
Output : -------
334, Harison
433, Rechard
453, Michel
533, Pal
您在电子表格中说“导出到文件”?喜欢.csv?
IMO 这是在 Robo 3T(以前称为 robomongo)中执行此操作的最简单方法:
在 Robo 3T GUI 的右上角有一个“以文本模式查看结果”按钮,单击它并复制所有内容
将所有内容粘贴到此网站:https ://json-csv.com/
单击下载按钮,现在您将其保存在电子表格中。
希望这对某人有所帮助,因为我希望 Robo 3T 具有导出功能
那里有一些 MongoDB GUI,其中一些具有对数据导出的内置支持。您可以在http://mongodb-tools.com找到完整的 MongoDB GUI 列表
您询问了关于导出查询结果的问题,而不是关于导出整个集合的问题。试试 3T MongoChef MongoDB GUI,这个工具支持您的特定用例。
不要在 shell 上运行此命令,在命令提示符处输入此脚本,并使用您的数据库名称、集合名称和文件名,全部替换占位符。
mongoexport --db (Database name) --collection (Collection Name) --out (File name).json
这个对我有用。
我不认为 robomongo 有这样的功能。因此,您最好将 mongodb 函数用作特定 Collection 的 mongoexport。
http://docs.mongodb.org/manual/reference/program/mongoexport/#export-in-json-format
但是,如果您正在寻找备份解决方案,最好使用
mongodump / mongorestore
如果您想使用mongoimport,您需要以这种方式导出:
db.getCollection('tables')
.find({_id: 'q3hrnnoKu2mnCL7kE'})
.forEach(function(x){printjsononeline(x)});
扩展 Anish 的答案,我想要一些可以应用于任何查询的东西,以自动输出所有字段,而不必在 print 语句中定义它们。它可能可以简化,但这是一种快速而肮脏的东西,效果很好:
var cursor = db.getCollection('foo').find({}, {bar: 1, baz: 1, created_at: 1, updated_at: 1}).sort({created_at: -1, updated_at: -1});
while (cursor.hasNext()) {
var record = cursor.next();
var output = "";
for (var i in record) {
output += record[i] + ",";
};
output = output.substring(0, output.length - 1);
print(output);
}
Florian Winter答案的扩展,适用于希望生成准备执行查询的人。
drop
并insertMany
使用查询cursor
:
{
// collection name
var collection_name = 'foo';
// query
var cursor = db.getCollection(collection_name).find({});
// drop collection and insert script
print('db.' + collection_name + '.drop();');
print('db.' + collection_name + '.insertMany([');
// print documents
while(cursor.hasNext()) {
print(tojson(cursor.next()));
if (cursor.hasNext()) // add trailing "," if not last item
print(',');
}
// end script
print(']);');
}
它的输出将类似于:
db.foo.drop();
db.foo.insertMany([
{
"_id" : ObjectId("abc"),
"name" : "foo"
}
,
{
"_id" : ObjectId("xyz"),
"name" : "bar"
}
]);
//on the same db
var cursor = db.collectionname.find();
while (cursor.hasNext()) {
var record = cursor.next();
db.new_collectionname.save(record);
}
您可以将--jsonArray
参数 / 标志添加到mongoexport
命令中,这会将结果导出为单个 json 数组。
然后在导入时再次指定--jsonArray
标志。
或者删除文件中的开始和结束数组括号 [],然后您修改和导出的文件将使用不带标志的mongoimport
命令导入。--jsonArray
更多关于导出的信息:https ://docs.mongodb.org/manual/reference/program/mongoexport/#cmdoption--jsonArray
在此处导入: https ://docs.mongodb.org/manual/reference/program/mongoimport/#cmdoption--jsonArray
我遇到了同样的问题,并且在 robomongo(Robo 3T 1.1.1)中运行脚本也不允许复制值,也没有导出选项。我能做到这一点的最好方法是使用 mongoexport,如果你的本地安装了 mongodb,你可以使用 mongoexport 连接到任何服务器上的数据库并提取数据
要连接到远程服务器上的数据和 csv 输出文件,请在命令行中运行以下 mongoexport
mongoexport --host HOSTNAME --port PORT --username USERNAME --password "PASSWORD" --collection COLLECTION_NAME --db DATABASE_NAME --out OUTPUTFILE.csv --type=csv --fieldFile fields.txt
fieldFile: 有助于提取所需的列,例如: fields.txt 的内容可以是:
用户身份
仅提取“userId”列的值
远程服务器上的数据,json输出文件:
mongoexport --host HOST_NAME --port PORT --username USERNAME --password "PASSWORD" --collection COLECTION_NAME --db DATABASE_NAME --out OUTPUT.json
这会将所有字段提取到 json 文件中
本地主机上的数据(mongodb 应该在本地主机上运行)
mongoexport --db DATABASE_NAME --collection COLLECTION --out OUTPUT.json
参考:https ://docs.mongodb.com/manual/reference/program/mongoexport/#use
简单的解决方案:
tostrictjson(db.getCollection(collection_name).find({}))
注意:
其他解决方案很好,但当您的集合具有等类型时,可能会在导入过程中导致Date
错误ObjectId
...
快乐黑客:)