Mongodb 如果记录存在,则更新,如果不存在,则创建新记录
我有一个这样的收藏。我想做的是按ID搜索一个项目,搜索单个成员,然后根据date属性查找特定的报告。如果找到了,我想更新时间。如果不是,我想创建一个新的报表对象 我正在创建一个测试应用程序来学习meteor。目前是meteor和NoSQLs(mongoDB)的新成员Mongodb 如果记录存在,则更新,如果不存在,则创建新记录,mongodb,meteor,Mongodb,Meteor,我有一个这样的收藏。我想做的是按ID搜索一个项目,搜索单个成员,然后根据date属性查找特定的报告。如果找到了,我想更新时间。如果不是,我想创建一个新的报表对象 我正在创建一个测试应用程序来学习meteor。目前是meteor和NoSQLs(mongoDB)的新成员 到目前为止,我所做的是更新“小时”字段,但我添加了一个新的“报告”字段,该字段具有嵌套对象。MongoDB具有upsert的概念,并在更新功能的选项中设置: Projects.update({ _id: projId
到目前为止,我所做的是更新“小时”字段,但我添加了一个新的“报告”字段,该字段具有嵌套对象。MongoDB具有upsert的概念,并在更新功能的选项中设置:
Projects.update({
_id: projId,
"members.id": memberId
}, {
$set: { "members.$.hours": hours }
});
db.collection.update(
,
,
{
插入:,
多重:,
writeConcern:,
排序规则:,
阵列过滤器:[,…]
}
)
对于您的案例,您很可能会找到$setOnInsert
操作符,因为默认情况下,它只设置您指定的更新值,如果您想在插入中插入其他项目,而不是在更新中插入,则可以使用此操作符。更多信息可以在这里找到-
请参阅更多阅读-MongoDB具有upsert的概念,并在更新功能的选项中设置:
Projects.update({
_id: projId,
"members.id": memberId
}, {
$set: { "members.$.hours": hours }
});
db.collection.update(
,
,
{
插入:,
多重:,
writeConcern:,
排序规则:,
阵列过滤器:[,…]
}
)
对于您的案例,您很可能会找到$setOnInsert
操作符,因为默认情况下,它只设置您指定的更新值,如果您想在插入中插入其他项目,而不是在更新中插入,则可以使用此操作符。更多信息可以在这里找到-
请参阅更多阅读-您可以选择简单的路线。。
使用findOne获取记录
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ]
}
)
在每一步都有控制权。findOne查询非常高效。您可以选择简单的路线。。
使用findOne获取记录
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ]
}
)
在每一步都有控制权。findOne查询非常有效。请查看
upsert
函数。查看upsert
功能。这可能会导致并发问题。这就是我所做的“并发问题”是什么意思@KevinSmith?如果两个请求/进程请求该项,但都接收到它不在那里,那么它们都将插入,一个将失败。。。在本例中,您没有指定\u id
,因此将创建两个文档而不是一个。这可能会导致并发问题。这就是我所做的“并发问题”是什么意思@KevinSmith?如果两个请求/进程请求该项,但都接收到它不在那里,那么它们都将插入,一个将失败。。。在本例中,您没有指定一个\u id
,因此将创建两个文档,而不是一个。我在等待答案时所做的是运行一个查询,检查它是否返回记录(true,false),然后执行我想要的操作。我肯定会看看这个。这会更好,因为操作是原子的。我在等待答案时做的是运行一个查询,检查它是否返回一条记录(真、假),然后做我想做的。我一定会看看这个。这会更好,因为操作是原子的