流星包:导入JSON数组到mongoDB
问题描述:
我正在尝试创建一个流星包来将JSON文件导入mongoDB中的集合。但我不太确定,如果这是可能的。流星包:导入JSON数组到mongoDB
所以我想让用户上传一个JSON文件。在输入字段中,用户还键入必须用于导入的集合名称。在此之后,JSON数组应该保存到给定的集合中。
HTML:
<template name="importJSON">
<form id="importJson">
<input type="text" id="collection">
<input type="file" id="file">
</form>
</template>
流星:
Template.importJSON.events({
'submit #importJson': function(e){
e.preventDefault();
var collection = e.target.collection.value;
var obj = JSON.parse(response);
db.collection.insert(obj);
}
});
所以我有三个问题是:
1)如何我要做上传本身,作为文件应该暂时上传
2)如何使用输入字段中给出的集合名称?
3)如何以正确的方式导入数据?插入只会将新数据附加到现有数据,不是吗?
答
因此,要回答你的三个问题:
1)如何做我必须做的上传本身,如果你需要做的是阅读文件应暂时上传
该文件,然后将其插入到集合中。在这种情况下,你甚至不需要上传文件。只需在客户端读取文件即可。这里是关于Reading files in JavaScript using the File APIs的文章。
2)如何使用输入字段中给定的集合名称?
说,在输入字段中给出的集合名称为products
,并假设你有一个这样的样本数据文件:
{
"name": "Product",
"id": "Product identifier",
"name": "Name of the product",
"price": "9990",
"tags": ["tag1", "tag2"]
}
在这一点上,你需要决定你是如何做到这一点。如果您在服务器端已经有Products
集合。
<your app name>/lib/collections/products.js
Products = new Meteor.Collection('Products');
在您的客户端代码
然后:
var rawproducts = (content of the file you read using the File API -- as mentioned above)
var newproducts = JSON.parse(rawproducts);
for (var i = 0; i < newproducts.length; i++) {
Products.insert(newproducts[i]);
}
您也可以通过创建一个本地唯一的集测试了这一点本地。
//pass null as collection name, it will create
//local only collection
Products = new Mongo.Collection(null);
for (var i = 0; i < newproducts.length; i++) {
Products.insert(newproducts[i]);
}
注:如果您使用的是本地唯一收藏您的数据仍然在客户端上。您需要将其与服务器同步(如上所述)以实现持久性。
3)如何以正确的方式导入数据?插入只会将新数据附加到现有数据,不是吗?
导入数据如上所示将继续追加数据。您可能想要考虑如何重写数据或完全覆盖现有数据。
希望这会有所帮助。
更新:
如何删除所有从集合中的元素?
Products.remove({}) // remove every product
哇,谢谢!如何在添加数据之前清空给定的集合? – user3142695
@ user3142695我现在已经更新了答案,以包含有关如何从集合中删除所有元素的详细信息? –
谢谢。希望最后一个问题:我尝试动态地制作完整的东西。这意味着用户可以选择应该使用的集合。那么我应该怎么做'Products = new Meteor.Collection('Products');'这个有一个变量?输入字段#collection提供集合 - 这在您的示例“Products”中。 – user3142695