在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
字段可以设置为True
或False
,日期也会一直不同 - 我不想添加到数组是否存在,无论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
如果它不存在则不执行任何操作确实存在。
答案 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"}
}