Javascript 如何在没有重复项的情况下更新MongoDB
我用的是流星框架和火焰。如何从API中获取数据,并仅在MongoDB集合中插入新数据而不是重复数据Javascript 如何在没有重复项的情况下更新MongoDB,javascript,mongodb,meteor,meteor-blaze,Javascript,Mongodb,Meteor,Meteor Blaze,我用的是流星框架和火焰。如何从API中获取数据,并仅在MongoDB集合中插入新数据而不是重复数据 从API获取数据 if (Meteor.isServer) { Meteor.methods({ fetchApiData: function () { this.unblock(); return Meteor.http.call('GET','http://jsonplaceholder.typicode.com/post
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 });
});
},
谢谢。我不熟悉您的特定框架,因此我无法帮助您理解语法,但您应该能够找到与您尝试插入的文档具有相同属性的所有文档(应该只有一个)。如果有,则使用
upsert
保存它。如果没有,则您保存的对象是唯一的,您应该保存一个新对象。以下是我在启动时如何处理所谓的引用数据。它是由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来处理插入与更新。仅使用“香草”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 });
});
}
},
如果你需要保证唯一性,你也应该在数据库中放置适当的唯一索引,如果没有它们,你在meteor中做的任何事情都可能失败。为什么不用简单的方法来做呢?我不确定我是否理解正确。是否必须将标题之类的内容与数据库中的现有条目进行比较?如果
title
是集合中唯一的字段,则可以简单地比较标题(或任何其他单个唯一字段,或使文档唯一的两个字段)。但是,如果没有唯一字段,则必须询问数据库是否存在与您试图保存的文档相同的完整文档(自动生成的sansid
、\u v
等字段)