javascript - 如果文档在 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);
}
但是,和以前一样,它不会创建任何文档。
我不确定接下来要尝试什么,或者我对上述解决方案的实施是否有问题。
解决方案
Events.update(data,data,{upsert: true});
LoopBack 模型不公开 MongoDB API。诸如create
提供由连接器映射到数据库命令的与数据库无关的 API 之类的方法。
如果您只想插入不存在的文档,则可以使用以下方法之一(取决于您要实现的目标):
replaceOrCreate
patchOrCreate
(也称为upsert
和updateOrCreate
)findOrCreate
upsertWithWhere
if(Events.find({itemOfData: resultData.itemOfData},{limit: 1}).size < 1){
该find
方法接受一个过滤器对象(请参阅查询数据),该对象不仅包含匹配记录的条件,还包含分页和要包含的相关模型等内容。条件存储在where
Filter 对象的属性中。
该find
方法还返回一个 Promise,您需要等到它解决后才能计算返回的记录数。
const found = Events.find({
where: {itemOfData: resultData.itemOfData}
limit: 1
});
if (found.size < 1){
// ...
}
虽然基于 的解决方案find
似乎在开发中运行良好,但它引入了一种竞争条件,当应用程序处于高负载状态时,可以创建两个“相同”的记录。只要有可能,建议使用内置函数,例如patchOrCreate
使用特定于数据库的方法来保证原子性。
推荐阅读
- date - 无法将“+0000 UTC”解析为“T”。Go UTC时间解析错误
- python - 带有 RTSP 提要的 Python Opencv 多线程
- javascript - 如何将 React.lazy 用于模块的组件?
- c++ - 用剩菜初始化类
- python - 如何根据特定条件在 Pandas Dataframe 中查找重复项?
- javascript - Node.js MySQL 查询无法将 MySQL 结果分配给变量
- python - 如何在 python 中更改日期格式,以便当我导出到 excel 时,日期与我的计算机日期设置相匹配
- amazon-web-services - 如何根据列表类型属性从 DynamoDB 表中获取记录,无需扫描操作
- php - PHP static CLASS __callstatic 魔术方法,但用于变量
- c# - 对象字符串不会显示在剃刀视图中