Mongo查询条件

时间:2018-04-10 11:16:10

标签: mongodb mongodb-query

我的文件结构是这样的:

{ 
    '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的阵列中。我可以在一个查询中执行此操作吗?我能想到的唯一解决方案包含两个不同的查询。

1 个答案:

答案 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