首页 > 解决方案 > 如果文档在 MongoDb 的远程方法中尚不存在,如何使用 LoopBack 插入文档

问题描述

我对 MongoDB 很陌生(大约 4 天),我正在尝试使用 Loopback 从远程方法中将文档插入到我的集合中,而不添加重复的文档。

我首先测试了这样添加文档:

Events.create(resultData);

哪个工作没有问题。

然后我继续尝试添加文档而不添加重复的其他一些答案

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

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

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

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

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

我不确定接下来要尝试什么,或者我对上述解决方案的实施是否有问题。

标签: javascriptmongodbloopbackjs

解决方案


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

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

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

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

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

find方法接受一个过滤器对象(请参阅查询数据),该对象不仅包含匹配记录的条件,还包含分页和要包含的相关模型等内容。条件存储在whereFilter 对象的属性中。

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

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

虽然基于 的解决方案find似乎在开发中运行良好,但它引入了一种竞争条件,当应用程序处于高负载状态时,可以创建两个“相同”的记录。只要有可能,建议使用内置函数,例如patchOrCreate使用特定于数据库的方法来保证原子性。


推荐阅读