首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果值没有匹配,则更新文档

如果值没有匹配,则更新文档
EN

Stack Overflow用户
提问于 2016-05-19 19:29:47
回答 3查看 935关注 0票数 4

在Mongodb中,如果文档的一个字段存在,如何跳过更新?

举个例子,我有以下文档结构,如果update键不匹配,我只想使用link结构。

代码语言:javascript
复制
{
    "_id": {
        "$oid": "56e9978732beb44a2f2ac6ae"
    },
    "domain": "example.co.uk",
    "good": [
        {
            "crawled": true,
            "added": {
                "$date": "2016-03-16T17:27:17.461Z"
            },
            "link": "/url-1"
        },
        {
            "crawled": false,
            "added": {
                "$date": "2016-03-16T17:27:17.461Z"
            },
            "link": "url-2"
        }

    ]
}

我的更新查询是:

代码语言:javascript
复制
links.update({
    "domain": "example.co.uk"
    },
    {'$addToSet':
        {'good':
            {"crawled": False, 'link':"/url-1"} }}, True)

部分问题是,crawl字段可以设置为TrueFalse,而且日期也总是不同的--如果存在URL,我不想添加到数组中,而不管crawled状态如何。

更新:只是为了清楚起见,如果不在文档中,我希望将其添加到现有数组中,例如,如果引入了/url-3,文档将如下所示:

代码语言:javascript
复制
{
    "_id": {
        "$oid": "56e9978732beb44a2f2ac6ae"
    },
    "domain": "example.co.uk",
    "good": [
        {
            "crawled": true,
            "added": {
                "$date": "2016-03-16T17:27:17.461Z"
            },
            "link": "/url-1"
        },
        {
            "crawled": false,
            "added": {
                "$date": "2016-03-16T17:27:17.461Z"
            },
            "link": "url-2"
        },
        {
            "crawled": false,
            "added": {
                "$date": "2016-04-16T17:27:17.461Z"
            },
            "link": "url-3"
        }

    ]
}

domain将是唯一的,并且特定于链接,如果link不存在,我希望它在good数组中插入它,如果它确实存在,则什么也不做。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-19 19:53:55

这样做的唯一方法是使用find_one方法查找集合中是否有与您的条件匹配的文档,还需要考虑筛选条件中的"good.link“字段。如果没有任何文档匹配,则使用update_one方法运行更新查询,但这次在查询条件中不使用"good.link“字段。另外,您不需要$addToSet操作符,因为它没有做任何简单的使用$push更新操作符的操作,它表明了您的意图。您也不需要在这里“插入”选项。

代码语言:javascript
复制
if not link.find_one({"domain": "example.co.uk", "good.link": "/url-1"}):
    link.update_one({"domain": "example.co.uk"}, 
                    {"$push": {"good": {"crawled": False, 'link':"/url-1"}}})
票数 2
EN

Stack Overflow用户

发布于 2016-05-20 22:22:55

在查询的“查找”部分中,将匹配以下所有文档

代码语言:javascript
复制
"domain": "example.co.uk"

你需要加上你不想匹配

代码语言:javascript
复制
'good.link':"/url-1"

所以试试

代码语言:javascript
复制
{
    "domain": "example.co.uk",
    "good.link": {$ne: "/url-1"}
}
票数 1
EN

Stack Overflow用户

发布于 2022-07-20 09:35:52

接受的答案是不正确的,因为它说,唯一的方法是首先使用findOne

您可以通过使用聚合流水线更新特性在单个db调用中执行此操作,这允许在更新中使用聚合运算符,现在策略是将两个数组连接在一起,第一个数组将始终是“好”数组,第二个数组将根据链接存在或不使用$cond的条件选择[new link]或空数组,如下所示:

代码语言:javascript
复制
links.update({
  "domain": "example.co.uk"
},
[
  {
    "$set": {
      "good": {
        "$ifNull": [
          "$good",
          []
        ]
      }
    }
  },
  {
    "$set": {
      "good": {
        "$concatArrays": [
          "$good",
          {
            "$cond": [
              {
                "$in": [
                  "/url-1",
                  "$good.link"
                ]
              },
              [],
              [
                {
                  "crawled": False,
                  "link": "/url-1"
                }
              ]
            ]
          }
        ]
      }
    }
  }
], True)

蒙戈游乐场

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37332442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档