在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,而且日期也总是不同的--如果存在URL,我不想添加到数组中,而不管crawled状态如何。
更新:只是为了清楚起见,如果不在文档中,我希望将其添加到现有数组中,例如,如果引入了/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数组中插入它,如果它确实存在,则什么也不做。
发布于 2016-05-19 19:53:55
这样做的唯一方法是使用find_one方法查找集合中是否有与您的条件匹配的文档,还需要考虑筛选条件中的"good.link“字段。如果没有任何文档匹配,则使用update_one方法运行更新查询,但这次在查询条件中不使用"good.link“字段。另外,您不需要$addToSet操作符,因为它没有做任何简单的使用$push更新操作符的操作,它表明了您的意图。您也不需要在这里“插入”选项。
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"}}})发布于 2016-05-20 22:22:55
在查询的“查找”部分中,将匹配以下所有文档
"domain": "example.co.uk"你需要加上你不想匹配
'good.link':"/url-1"所以试试
{
"domain": "example.co.uk",
"good.link": {$ne: "/url-1"}
}发布于 2022-07-20 09:35:52
接受的答案是不正确的,因为它说,唯一的方法是首先使用findOne。
您可以通过使用聚合流水线更新特性在单个db调用中执行此操作,这允许在更新中使用聚合运算符,现在策略是将两个数组连接在一起,第一个数组将始终是“好”数组,第二个数组将根据链接存在或不使用$cond的条件选择[new link]或空数组,如下所示:
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)https://stackoverflow.com/questions/37332442
复制相似问题