Python 如果值不匹配,则更新文档
在Mongodb中,如果文档中存在一个字段,如何跳过更新 举个例子,我有下面的文档结构,如果Python 如果值不匹配,则更新文档,python,mongodb,mongodb-query,pymongo,Python,Mongodb,Mongodb Query,Pymongo,在Mongodb中,如果文档中存在一个字段,如何跳过更新 举个例子,我有下面的文档结构,如果链接键不匹配,我只想更新它 { "_id": { "$oid": "56e9978732beb44a2f2ac6ae" }, "domain": "example.co.uk", "good": [ { "crawled": true, "added": { "$
链接
键不匹配,我只想更新它
{
"_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选项,但从其他方面看,它不起作用。我假设您可以批量执行这些操作,因为它们是单独的请求?