我的文件结构是这样的:
{
'name': 'name1',
'sources': [
{
'site': 'www.example1.com',
'first_seen_date': ISODate("2018-04-09T15:43:49.941Z"),
'last_seen_date': ISODate("2018-04-09T15:43:49.941Z")
},
{
'site': 'www.example2.com',
'first_seen_date': ISODate("2018-02-09T15:43:49.941Z"),
'last_seen_date': ISODate("2018-04-10T15:43:49.941Z")
}
]
}
我希望找到具有特定名称的文件'和'网站' - 如果存在则更新last_seen_date。如果只存在名称且站点不存在 - 将站点添加到包含site,first_seen_date,last_seen_date的阵列中。我可以在一个查询中执行此操作吗?我能想到的唯一解决方案包含两个不同的查询。
答案 0 :(得分:1)
您可以使用2个updateOne
个查询,其中一个使用$ne
& $set
和$push
一个接一个。这仍将使它成为原子"即使您使用多个应用程序节点,也要进行操作:
db.test.updateOne(
{
name: 'name1',
'sources.site': 'www.example3.com'
},
{
$set: {
'sources.$.last_seen_date': new Date()
}
}
)
db.test.updateOne(
{
name: 'name1',
'sources.site': {$ne: 'www.example3.com'}
},
{
$push: {
sources: {
site: 'www.example3.com',
first_seen_date: new Date(),
last_seen_date: new Date(),
}
}
}
)
不幸的是,对象键的$addToSet
不可用。这会使这个问题变得更容易。看来这个功能请求很久才打开:
https://jira.mongodb.org/browse/SERVER-13841