如何使用 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
(也称为 upsert
和 updateOrCreate
)
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 意味着保证原子性。
我是 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
(也称为upsert
和updateOrCreate
)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 意味着保证原子性。