【问题标题】:If record exist, update if not create new如果记录存在,则更新,如果不创建新的
【发布时间】:2018-02-07 17:41:16
【问题描述】:
{
  "_id": "W4ZZxraDXGj3FtJek",
  "name": "Rust",
  "description": "new programming language by google",
  "organization": "rYefzmKDCoqKJQmeA",
  "status": "active",
  "dateAdded": "2018-02-07T13:51:31.564Z",
  "members": [
    {
      "id": "6BuSTu6GZybkmozWW",
      "role": "manager",
      "hours": "",
      "dateAdded": "2018-02-07T15:13:30.654Z",
      "reports": [
        {
          "date": "2018-02-06T12:39:32.118Z",
          "hours": "19123"
        },
        {
          "date": "2018-02-05T12:39:32.118Z",
          "hours": "19123"
        }
      ]
    },
{
      "id": "aFJlejSTu6erawlkjeru",
      "role": "manager",
      "hours": "",
      "dateAdded": "2018-02-07T15:13:30.654Z",
      "reports": [
        {
          "date": "2018-02-06T12:39:32.118Z",
          "hours": "19123"
        }
        }
      ]
    }
  ]
}

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

我正在创建一个测试应用程序来学习流星。目前是流星和 NoSQL (mongoDB) 的新手

 Projects.update({
       _id: projId,
       "members.id": memberId
    }, { 
       $set: { "members.$.hours": hours } 
      });

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

【问题讨论】:

标签: mongodb meteor


【解决方案1】:

MongoDB 有一个 upsert 的概念,并在更新函数的选项中设置:

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ]
   }
)

您很可能会为您的情况找到 $setOnInsert 运算符,因为默认情况下,如果您想在插入项上插入其他项目而不是您可以使用的更新,它只会设置您指定的更新值这个运算符。更多信息可以在这里找到 -https://docs.mongodb.com/manual/reference/operator/update/setOnInsert/

查看更多阅读 - https://docs.mongodb.com/manual/reference/method/db.collection.update/#upsert-option

【讨论】:

  • 我在等待答案时所做的是运行查询,检查它是否返回记录(真,假)然后做我想做的事。我一定会看看这个。
  • 这会更好,因为操作是原子的
【解决方案2】:

你可以走简单的路线.. 使用 findOne 获取记录。

const p = Projects.findOne({_id:id});

//If record exists update or insert.

if(p){
Projects.update({_id:id},{$set:{abcd:defg}});
}else{
Projects.insert({abcd:defg});
}

控制每一步。 findOne 查询非常高效。

【讨论】:

  • 这可能会导致并发问题
  • 谢谢。这就是我所做的
  • “并发问题”是什么意思@KevinSmith?
  • 如果 2 个请求/进程请求该项目并且都收到它不存在,那么它们都将插入并且一个将失败......在此示例中,您没有指定 _id因此将创建 2 个文档而不是 1 个。
猜你喜欢
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多