Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.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
Python 如果值不匹配,则更新文档_Python_Mongodb_Mongodb Query_Pymongo - Fatal编程技术网

Python 如果值不匹配,则更新文档

Python 如果值不匹配,则更新文档,python,mongodb,mongodb-query,pymongo,Python,Mongodb,Mongodb Query,Pymongo,在Mongodb中,如果文档中存在一个字段,如何跳过更新 举个例子,我有下面的文档结构,如果链接键不匹配,我只想更新它 { "_id": { "$oid": "56e9978732beb44a2f2ac6ae" }, "domain": "example.co.uk", "good": [ { "crawled": true, "added": { "$

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

举个例子,我有下面的文档结构,如果
链接
键不匹配,我只想
更新它

{
    "_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
字段可以设置为
True
False
,并且日期也总是不同的-如果URL存在,我不想添加到数组中,无论
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"
        }

    ]
}

将是唯一且特定于链接的,我希望它将
链接
插入
good
数组中(如果它不存在),如果它确实存在,则不执行任何操作。

唯一的方法是使用该方法查找集合中是否有符合您标准的文档,此外,还需要考虑过滤器标准中的“好链接”字段。如果没有文档匹配,则使用该方法运行更新查询,但这次在查询条件中不使用“good.link”字段。另外,您不需要操作符,因为它不做任何简单的事情。使用update操作符,它可以清楚地表明您的意图。您也不需要在此处“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"}}})

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

"domain": "example.co.uk"
您需要添加您不想匹配的内容

'good.link':"/url-1"
所以试试看

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

我更新了我的问题,希望能更清楚,因为它是在添加一个新文档,而不是添加到阵列中。您为什么要使用
upsert
选项?如果不匹配,是否要插入新文档?“域”也是唯一的吗?是的,
对于
链接
是唯一的-我想我可能使用不正确,如果它不存在,我希望它在数组中插入链接,如果它存在,则什么也不做,这是有效的!虽然我需要重新添加upsert选项,但从其他方面看,它不起作用。我假设您可以批量执行这些操作,因为它们是单独的请求?