我有一个包含以下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文档。 有没有办法在同一个集合中插入文本文件的所有文档?
感谢您给我的任何帮助。
答案 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包含你的输入文件)