当前位置: 首页 > 知识库问答 >
问题:

插入新文档到Mongo仅当类似的一个不存在

索嘉胜
2023-03-14

我有以下文件在蒙戈收藏-

{
  key1: "someValue",
  key2: "someValue2",
  key3: "someValue3",
  firstSeen: "2021-03-17",
  lastSeen: "2021-03-17",
  timesSeen: 1
}

我想将此文档添加到Mongo,只有当具有key1key2key3值的类似文档中不存在时。

如果确实存在类似的文档,我希望仅更新timesSeen(递增1)和lastSeen(设置今天的日期)值。

这样做的正确和最有效的方法是什么?我是否可以使用一个命令来执行此操作,而无需在之前搜索相关文档并插入新文档/根据该命令更新现有文档

共有1个答案

糜雪峰
2023-03-14

您可以使用upsert on update和$and运算符检查键exist和$eq以比较值

db.collection.update({
  $and: [
    {
      $and: [
        {
          key1: {
            $exists: true
          }
        },
        {
          key1: {
            $eq: "someValue"
          }
        }
      ]
    },
    {
      $and: [
        {
          key2: {
            $exists: true
          }
        },
        {
          key2: {
            $eq: "someValue2"
          }
        }
      ]
    },
    {
      $and: [
        {
          key3: {
            $exists: true
          }
        },
        {
          key3: {
            $eq: "someValue3"
          }
        }
      ]
    },
    
  ]
},
{
  $inc: {
    timesSeen: 1
  },
  $set: {
    key1: "someValue",
    key2: "someValue2",
    key3: "someValue3",
    lastSeen: new Date()
  }
},
{
  upsert: true
})

蒙戈游乐场:https://mongoplayground.net/p/Kqt3TYCs3Aw

 类似资料:
  • 我有一个具有以下模式的用户集合: 用户将查找用户。名称,必须是唯一的。添加新用户时,我首先执行搜索,如果没有找到这样的用户,我会将新用户文档添加到集合中。搜索用户和添加新用户(如果未找到)的操作不是原子操作,因此,当多个应用程序服务器连接到DB服务器时,可能会同时收到两个具有相同用户名的添加用户请求,从而导致两个添加用户请求都找不到这样的用户,这反过来会导致两个文档具有相同的“user.name”

  • 我正在尝试在我的Mongo数据库中插入一个新文档,如下所示: 正在工作,但不是我想要的。 “json”是一个对象数组,如下所示: 所以,我的代码为object创建了一个文档,我只想创建一个文档,其中包含一个名为json的属性中的对象: 这可能吗? 我试图使用插入,也。 谢谢。

  • 我试图实现的很简单。只有当数据库不存在时,我才需要在数据库中创建一个用户条目。 应用程序流程: 使用Firebase身份验证(获取UID)创建用户 客户端代码(创建操作): firestore规则: 附加信息: 正如您可能已经知道的那样,代码不起作用。每次我运行客户端代码时,当前用户都会被一个新文档完全替换。但是,如果我从规则中删除以下行,一切都会正常工作: 但现在问题来了,如何保护用户文档中的数

  • 我想知道是否有一种方法可以插入新文档并一次返回。 这是我目前使用的:

  • 我在用弹性搜索和Nest库。我想知道当文档存在时,如何将文档批量插入ElasticSearch而不更新?

  • 我有两个收藏(A和B),每个收藏约70000份文档。如果我比较A和B,95%的文档是相同的,只有5%是不同的。每个文档的结构在A和B中完全相同。A是一个固定集合,B是一个临时集合。我想将B合并到A中。如果A中存在来自B的文档-- ...我正在使用Python驱动程序(如果有必要的话)。 最有效的方法是什么?非常感谢。