使用mongo脚本导入JSON

问题描述 投票:0回答:5

我正在尝试编写一个 mongo 脚本来从

jsonArray
文件导入
JSON
。我的脚本采用
.js
格式,我在
mongo shell
中使用 load() 命令执行它。可以用
mongo script
来做吗?

我知道我可以用

mongoimport
代替。但我想知道一种用脚本来做到这一点的方法。

下面给出了我当前脚本中缺少导入部分的内容..

var db = connect("localhost:27017/fypgui");
//Import json to "crimes" collection here 
var crimes = db.crimes.find();
while (crimes.hasNext()){
    var item = crimes.next();
    var year =(item.crime_date != null)?(new Date(item.crime_date)).getFullYear():null;
    db.crimes.update( {_id: item._id}, {$set: {crime_year: year}});
}
javascript json mongodb
5个回答
12
投票

这个问题还有另一个答案。 虽然有点老了我还是要回复一下。

可以使用 mongo shell 来完成此操作。

您可以通过在 JSON 前面加上

var myData=
前缀将 JSON 转换为有效的 JavaScript,然后使用 load() 命令加载 JavaScript。 在 load() 之后,您将能够通过 myData 对象从 mongo 脚本中访问您的数据。

数据.js

var myData=
[
        {
                "letter" : "A"
        },
        {
                "letter" : "B"
        },
        {
                "letter" : "C"
        }
]

read.js

#!/usr/bin/mongo --quiet

// read data

load('data.js');

// display letters

for (i in myData) {
  var doc  = myData[i];
  print(doc.letter);
}

编写 JSON 最简单的方法是将结果加载到单个对象中。 开头用

var result={}
初始化对象,最后用printjson()输出。 使用标准重定向将数据输出到文件。

write.js

#!/usr/bin/mongo --quiet

var result=[];

// read data from collection etc...
for (var i=65; i<91; i++) {
  result.push({letter: String.fromCharCode(i)});
}

// output
print("var myData=");
printjson(result);

shebang 行 (#!) 将在 Unix 类型操作系统(Linux 或 MacO)上运行,它们也应该在带有 Cygwin 的 Windows 上运行。


3
投票

可以使用 mongo shell 中未记录的

cat()
函数以文本形式获取文件内容:

var text = cat(filename);

如果您感兴趣

cat()
和其他未记录的实用程序,例如
writeFile
在此文件中定义:shell_utils_extended.cpp

有了文件内容,您可以根据需要修改它或直接将其传递给

JSON.parse
以获取JavaScript对象:

jsObj = JSON.parse(text);

但要小心:不幸的是,就其 JSON 解析能力而言,

JSON.parse
并不等同于
mongoimport
工具。

mongoimport
能够以规范格式解析Mongo的扩展JSON。 (例如,规范格式文件由
bsondump
mongodump
创建。有关 JSON 格式的更多信息,请参阅 MongoDB 扩展 JSON)。

JSON.parse
不支持规范的JSON格式。它将读取规范格式输入并返回 JavaScript 对象,但规范格式 JSON 中存在的扩展数据类型信息将被忽略。


1
投票

不,mongo shell 不具备像成熟的编程环境那样读取和写入文件的能力。使用 mongoimport,或者使用官方驱动程序的语言编写脚本。尽管 Node.js 是一个异步/事件驱动的编程环境,但 Node.js 的语法非常接近 mongo shell。如果您不想处理构建使用回调的逻辑,Python/PyMongo 将是类似且易于学习的。


1
投票

嘿,我知道这不相关,但是,每次我需要将一些 json 导入到我的 mongo 数据库时,我都会做一些糟糕的复制、粘贴和运行,直到我受够了! 如果你也遇到同样的问题,我写了一个小批处理脚本来为我做到这一点。有兴趣吗?

https://github.com/aminjellali/batch/blob/master/mongoImporter.bat

@echo off
title = Mongo Data Base importing tool
goto :main

:import_collection
    echo importing %~2
    set file_name=%~2
    set removed_json=%file_name:.json=%
    mongoimport --db %~1 --collection %removed_json% --file %~2
goto :eof

:loop_over_files_in_current_dir
    for /f %%c in ('dir /b *.json') do call :import_collection %~1 %%c
goto :eof

:main
    IF [%1]==[] (
    ECHO FATAL ERROR: Please specify a data base name
    goto :eof
    ) ELSE (
    ECHO @author amin.jellali
    ECHO @email [email protected]
    echo starting import...
    call :loop_over_files_in_current_dir %~1
    echo import done...
    echo hope you enjoyed me
    )
goto :eof

0
投票

我已经寻找这个问题有一段时间了,给出的答案要么不起作用,要么只是提供了解决方法。

幸运的是我找到了答案..您可以使用

fs.readFileSync
来读取(json)文件。为了完整起见,这是我的整个脚本:

const dbName = process.env.DB_NAME || 'test_db';
const dbUser = process.env.DB_USER || 'test_user';
const dbPassword = process.env.DB_PASSWORD || 'secret';

db.createUser({
  user: dbUser,
  pwd: dbPassword,
  roles: [
    {
      role: 'readWrite',
      db: dbName,
    },
  ],
});

// Create and seed collections:

const collections = [
  'some_collection',
  'another_collection',
];

for (let i = 0; i < collections.length; i++) {
  const collectionName = collections[i];
  db.createCollection(collectionName);

  let jsonFile;
  try {
    jsonFile = fs.readFileSync(`/docker-entrypoint-initdb.d/mongo.${collectionName}.json`, 'utf8');
  }
  catch (err) {
    console.log(`NOTE: mongo.${collectionName}.json not found! Skip seeding of ${collectionName} collection..`)
    continue;
  }
  const json = JSON.parse(jsonFile);

  // Parse the $oid ids that Mongo uses in exports, but cant use in insertMany:
  for (let i = json.length; i--;) {
    json[i]._id = json[i]._id.$oid;
  }

  db[collectionName].insertMany(json);
}
© www.soinside.com 2019 - 2024. All rights reserved.