正如标题所说,我想通过_id执行文档的查找(一个),如果不存在,则创建它,然后是否找到它或者是否已创建它,让它在回调中返回.
如果它存在,我不想更新它,因为我读过findAndModify.我在Stackoverflow上看到了很多关于此问题的其他问题,但同样,不希望更新任何内容.
我不确定是否通过创建(不存在),这实际上是每个人都在谈论的更新,它都是如此令人困惑:(
如果文档不存在而不更新现有文档(如果存在),如何插入文档?
假设我有一份文件如下:
{
"company":"test",
"name":"nameVal"
}
Run Code Online (Sandbox Code Playgroud)
我想检查集合是否包含公司test,如果它不存在我想创建一个新文档.如果它存在我想做什么都没有.我试过update了upsert = true.但它会更新现有文档(如果存在).
这是我试过的:
db.getCollection('companies').update(
{
"company": "test"
},
{
"company": "test",
"name": "nameVal2"
},
{upsert:true}
)
Run Code Online (Sandbox Code Playgroud)
感谢使用一个查询解决此问题的任何帮助.
在 Mongoose 中,我正在寻求以原子方式执行Model.FindOne-Or-Insert()与当前可用的类似功能和签名的方法,Model.FindOneAndUpdate()除非实例存在(即匹配filter)然后不使用提供的更新object但原样返回找到的实例,如果不存在(即不匹配) with filter) 然后插入object并返回新实例。
我找不到一种方法,Model.FindOneAndUpdate()通过尝试对现有实例进行更改,options并且不提供object不希望在实例存在时不更新的字段来对现有实例执行更新。
因此,我当前的非原子解决方法是Model.FindOne(),如果找不到,则执行Document.save().
const Foo = DB.model('foo', FooSchema)
async function findOneAndUpdateFoo(jsonFoo, next) {
const filter = {
deletedAt: null
}
if (jsonFoo.dsAccountId) {
filter.dsAccountId = jsonFoo.dsAccountId
}
if (jsonIntegration.dsUserId) {
filter.dsUserId = jsonIntegration.dsUserId
}
if (jsonFoo.providerId) {
filter.providerId = jsonFoo.providerId
}
const fooDoc = {
name: jsonFoo.name,
dsAccountId: jsonFoo.dsAccountId,
dsUserId: jsonFoo.dsUserId, …Run Code Online (Sandbox Code Playgroud)