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

How to insert documents if they don't already exist from within a remote method in MongoDb using LoopBack

我是 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);
}

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

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

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

LoopBack 模型不公开 MongoDB API。 create 之类的方法提供了 database-agnostic API,它由连接器映射到数据库命令。

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

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

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

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

也是find方法returns一个Promise,需要等到resolved再统计返回的记录数

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

虽然基于 find 的解决方案在开发中似乎运行良好,但它引入了竞争条件,即当应用程序处于高负载时可以创建两个 "same" 记录。只要有可能,建议使用 built-in 函数,例如 patchOrCreate,使用 database-specific 意味着保证原子性。