Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如果记录存在,则更新,如果不存在,则创建新记录_Mongodb_Meteor - Fatal编程技术网

Mongodb 如果记录存在,则更新,如果不存在,则创建新记录

Mongodb 如果记录存在,则更新,如果不存在,则创建新记录,mongodb,meteor,Mongodb,Meteor,我有一个这样的收藏。我想做的是按ID搜索一个项目,搜索单个成员,然后根据date属性查找特定的报告。如果找到了,我想更新时间。如果不是,我想创建一个新的报表对象 我正在创建一个测试应用程序来学习meteor。目前是meteor和NoSQLs(mongoDB)的新成员 到目前为止,我所做的是更新“小时”字段,但我添加了一个新的“报告”字段,该字段具有嵌套对象。MongoDB具有upsert的概念,并在更新功能的选项中设置: Projects.update({ _id: projId

我有一个这样的收藏。我想做的是按ID搜索一个项目,搜索单个成员,然后根据date属性查找特定的报告。如果找到了,我想更新时间。如果不是,我想创建一个新的报表对象

我正在创建一个测试应用程序来学习meteor。目前是meteor和NoSQLs(mongoDB)的新成员


到目前为止,我所做的是更新“小时”字段,但我添加了一个新的“报告”字段,该字段具有嵌套对象。

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),然后执行我想要的操作。我肯定会看看这个。这会更好,因为操作是原子的。我在等待答案时做的是运行一个查询,检查它是否返回一条记录(真、假),然后做我想做的。我一定会看看这个。这会更好,因为操作是原子的