我是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);
}
但是,像以前一样,它不会创建任何文档。
我不确定下一步该怎么做,或者我对上述解决方案的执行是否有误。
答案 0 :(得分:1)
Events.update(data,data,{upsert: true});
LoopBack模型不公开MongoDB API。诸如create
之类的方法提供了与数据库无关的API,该API由连接器映射到数据库命令。
如果只想插入不存在的文档,则可以使用以下方法之一(取决于要实现的目标):
replaceOrCreate
patchOrCreate
(也称为upsert
和updateOrCreate
)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
之类的内置函数,这些函数使用特定于数据库的方法来保证原子性。