Javascript 如果没有';在使用环回的MongoDb中,远程方法中已经存在t

Javascript 如果没有';在使用环回的MongoDb中,远程方法中已经存在t,javascript,mongodb,loopbackjs,Javascript,Mongodb,Loopbackjs,我对MongoDB非常陌生(大约4天),我正在尝试使用Loopback从远程方法将文档插入到我的集合中,而不添加重复的文档 我首先测试了添加文档,例如: Events.create(resultData); 没有问题 然后,我继续尝试在不添加重复项的情况下添加文档: 但是,这并没有向数据库添加任何内容 我决定继续,试着看看是否可以先检查是否可以从集合中找到文档,从而不添加文档。类似于 if(Events.find({itemOfData:resultData.itemOfData},{limi

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

我首先测试了添加文档,例如:

Events.create(resultData);
没有问题

然后,我继续尝试在不添加重复项的情况下添加文档:

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

我决定继续,试着看看是否可以先检查是否可以从集合中找到文档,从而不添加文档。类似于

if(Events.find({itemOfData:resultData.itemOfData},{limit:1}).size<1){
创建(resultData);
}
但是,与以前一样,它不创建任何文档

我不确定下一步该尝试什么,也不确定我对上述解决方案的实现是否有缺陷

Events.update(数据,数据,{upsert:true})

环回模型不公开MongoDB API。像
create
这样的方法提供了由连接器映射到数据库命令的数据库无关API

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

  • replace或create
  • patchOrCreate
    (也称为
    upsert
    updateOrCreate
  • findOrCreate
  • upsertWithWhere
if(Events.find({itemOfData:resultData.itemOfData},{limit:1}).size<1){

find
方法接受一个筛选器对象(请参阅),该对象不仅包含匹配记录的条件,还包含分页以及要包含的相关模型。该条件存储在筛选器对象的
where
属性中

另外,
find
方法返回一个承诺,您需要等待它得到解决,然后再计算返回的记录数

const found=Events.find({
其中:{itemOfData:resultData.itemOfData}
限额:1
});
如果(发现。尺寸<1){
// ...
}
虽然基于
find
的解决方案在开发过程中似乎运行良好,但它引入了一种竞争条件,即当应用程序处于高负载时,可以创建两个“相同”的记录。建议尽可能使用内置函数,如
patchOrCreate
,这些函数使用特定于数据库的方法来保证原子性

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