将多个BSonDocuments从文件插入MongoDB

时间:2014-10-31 13:56:38

标签: json mongodb import bson

我有一个包含以下JSON信息的文本文件:

{
  "name" : "system-admin",
  "description" : "Administrador de Sistema",
  "id" : 9,
  "roleid" : 6
}{
  "name" : "rs-promo-server",
  "description" : "Servidor de Promo",
 "id" : 10,
 "roleid" : 7

}

我正在尝试使用以下代码将多个BSONDocuments插入Mongo:

BsonDocument doc = BsonDocument.Parse(Json); //Json is a string variable that holds the file    content            
var collection = BaseDatos.GetCollection<BsonDocument>(nombreCollection);
collection.Insert(doc);     

代码工作正常,但它只插入文件的第一个BSON文档。 有没有办法在同一个集合中插入文本文件的所有文档?

感谢您给我的任何帮助。

1 个答案:

答案 0 :(得分:1)

BsonDocument.Parse(str)只解析一个JSON文档。你在字符串中有更多的东西。

基本上你有两个选择:

如果您可以更改输入文件的格式,以便每个JSON位于单独的行上(您需要最后一行空行以通知最后一个obj),您可以使用readline模块:

var fs = require('fs')
var file = 'data.d'

var readline = require('readline')
  , rl = readline.createInterface({
        input : fs.createReadStream(file)
      , output: process.stdout
      , terminal: false
    })

    rl.on('line', function (line) {

      console.log('line: ')
      var obj = {}
      try {
        obj = JSON.parse(line)
      } catch (e) {
        console.log('error: ' + e)
        return
      }
      console.log(obj)
    })

如果你不能改变格式,我担心你必须自己解析字符串,找到JSON对象的边界并单独解析它们(假设你没有嵌套的JSON对象,否则会更复杂):

var fs = require('fs')
var file = 'data.d'
var s = fs.readFileSync(file, 'utf8')
var start = s.indexOf('{')
var end = s.indexOf('{', start + 1)
while (start !== -1 && end !== -1) {
  var oneObjStr = s.substring(start, end)
  var oneObj = JSON.parse(oneObjStr)
  // save obj into db
  console.log(oneObj)
  start = end
  end = s.indexOf('{', start + 1)
}
if (start !== -1) {
  var lastOne = JSON.parse(s.substring(start, s.length))
  // save the last obj into db
  console.log(lastOne)
}

我认为,您还可以将对象存储到数组中并将该数组存储在一个mongodb插入中:

var objs = []
objs.push(oneObj)
// save into db in batch
// db.coll.insert(objs, ...) 

(只是为了澄清 - data.d包含你的输入文件)