我正在使用Blaze的Meteor框架。如何从API获取数据并仅在MongoDB集合中插入新数据而不是重复数据?
从API中获取数据。
if (Meteor.isServer) {
Meteor.methods({
fetchApiData: function () {
this.unblock();
return Meteor.http.call('GET','http://jsonplaceholder.typicode.com/posts');},
将数据插入数据库:
populateDatabaseApi: function () {
Meteor.call('fetchApiData', function(error, result) {
myCollection.insert({
//upsert: true,
A: result.data.title,
B: result.data.userId,
C: result.data.id });
});
},
当使用“myCollection.update”和“upsert:true”时,它显然不会插入新条目。检查API数据并仅插入没有重复项的新条目并更新现有条目的最佳做法是什么?
谢谢。
答案 0 :(得分:1)
这里是我如何处理我在启动时称为参考数据的方式。它取决于JSON数据。你必须选择一个作为你的"参考"对于每个JSON对象,您可以看到它是否已经在数据库中。
_.each(ItemData.items, function(q) {
check(q, ItemsSchema);
Items.upsert({
item: q.item
}, {
$set: {
item: q.item,
}
}, function(error, result) {
if (error) {
let errMsg = 'Error while writing item data';
console.error(errMsg, error);
throw new Meteor.Error('500', errMsg);
}
});
});
我使用upsert来处理插入vs更新。
答案 1 :(得分:0)
我不熟悉您的特定框架,因此我无法提供语法帮助,但您应该能够找到所有与相同属性的文档作为您的文档#39;重新尝试插入(应该只有一个)。如果有,则使用upsert
保存。如果没有,那么您保存的对象是唯一的,您应该保存一个新对象。
答案 2 :(得分:0)
仅使用“vanilla”Meteor,假设您的api对象具有唯一的ID并且您具有正确的数据访问权(即,如果findOne找到它的项目),我将使用:
populateDatabaseApi: function () {
Meteor.call('fetchApiData', function(error, result) {
var item = myCollection.findOne({A : result.data.id})
if(item){
//do nothing, this item already is in the db
}else{
myCollection.insert({
A: result.data.title,
B: result.data.userId,
C: result.data.id });
});
}
},