如果值不匹配则更新文档

时间:2016-05-19 19:29:48

标签: python mongodb mongodb-query pymongo

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

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

{
    "_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"
        }

    ]
}

我的更新查询是:

links.update({
    "domain": "example.co.uk"
    },
    {'$addToSet':
        {'good':
            {"crawled": False, 'link':"/url-1"} }}, True)

部分问题是crawl字段可以设置为TrueFalse,日期也会一直不同 - 我不想添加到数组是否存在,无论crawled状态如何。

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

{
    "_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如果它不存在则不执行任何操作确实存在。

2 个答案:

答案 0 :(得分:2)

执行此操作的唯一方法是使用find_one方法查找集合中是否有符合条件的文档,还需要考虑" good.link"过滤条件中的字段。如果没有文档匹配,则使用update_one方法运行更新查询,但这次您不使用" good.link"查询条件中的字段。此外,您不需要$addToSet运营商,因为它没有做任何简单的使用$push更新运算符,它会使您的意图明确。你也不需要" upsert"选项在这里。

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"}}})

答案 1 :(得分:0)

在查询的查找部分中,您匹配所有文档

"domain": "example.co.uk"

您需要添加您不想匹配的内容

'good.link':"/url-1"

所以试试

{
    "domain": "example.co.uk",
    "good.link": {$ne: "/url-1"}
}