如果使用LoopBack在MongoDb的远程方法中不存在文档,如何插入文档

时间:2019-06-10 13:34:18

标签: javascript mongodb loopbackjs

我是MongoDB的新手(大约4天之内),我试图使用Loopback从远程方法中将文档插入到我的集合中,而无需添加重复的文档。

我首先测试了添加文档的方式,

Events.create(resultData);

工作没问题。

然后我继续尝试添加文档而不添加重复的a few other answers

Events.update(data,data,{upsert: true});

但是,这没有向数据库添加任何内容。

我决定继续尝试,看看是否可以先检查是否可以从集合中找到文档,因此不添加该文档。类似于this answer

if(Events.find({itemOfData: resultData.itemOfData},{limit: 1}).size < 1){
    Events.create(resultData);
}

但是,像以前一样,它不会创建任何文档。

我不确定下一步该怎么做,或者我对上述解决方案的执行是否有误。

1 个答案:

答案 0 :(得分:1)

  

Events.update(data,data,{upsert: true});

LoopBack模型不公开MongoDB API。诸如create之类的方法提供了与数据库无关的API,该API由连接器映射到数据库命令。

如果只想插入不存在的文档,则可以使用以下方法之一(取决于要实现的目标):

  • replaceOrCreate
  • patchOrCreate(也称为upsertupdateOrCreate
  • findOrCreate
  • upsertWithWhere
  

if(Events.find({itemOfData: resultData.itemOfData},{limit: 1}).size < 1){

find方法接受一个Filter对象(请参阅Querying data),该对象不仅包含匹配记录的条件,而且还包含诸如分页和要包含的相关模型之类的内容。条件存储在Filter对象的where属性中。

此外,find方法还会返回一个Promise,您需要等到它解决后才能计算返回的记录数。

const found = Events.find({
  where: {itemOfData: resultData.itemOfData}
  limit: 1
});
if (found.size < 1){
  // ...
}

尽管基于find的解决方案在开发中似乎可以很好地工作,但它引入了竞争条件,当应用程序处于高负载状态时,可以创建两个“相同”记录。建议尽可能使用patchOrCreate之类的内置函数,这些函数使用特定于数据库的方法来保证原子性。