本地MongoDb与CosmosDb查询执行的差异

时间:2018-05-29 06:58:53

标签: mongodb azure azure-cosmosdb

请参阅下面的文件结构(在“文件集”标题下)。 我想写一个查询,它会根据需求时间给我文档,并过滤掉已经对给定时间有所需要的资源,并为我提供给定需求的可用资源(仅基于时间)。每个资源都有一个需求时间的需求数组。

基本上,我们需要满足需求数组中每个子文档的以下条件的文档。

startTime: {$gte: demand.EndTime}, endTime: {$lte: demand.StartTime}

因此,无法找到任何合适的运算符我决定反转 “不匹配”文档的结果

为了简单起见,我创建了以下需求要求和资源文档以及MongoDb和CosmosDb的结果。

需求查询:

db.getCollection('try').
find(
    {"demands": 
        { $not: 
            {$elemMatch:
                { 
                    startTime: {$lt: 8}, endTime: {$gt: 6}  //startTime: {$lt: demand.endTime}, endTime: {$gt: demand.startTime}
                }
            }
        }
    }
)

文件集

文档1:

{
    "_id" : 10439090,
    "demands" : [ 
        {
            "_id" : 1003,
            "name" : "Barclays Project",
            "startTime" : 10,
            "endTime" : 20
        }, 
        {
            "_id" : 1003,
            "name" : "Barclays Project",
            "startTime" : 30,
            "endTime" : 40
        }, 
        {
            "_id" : 1003,
            "name" : "Barclays Project",
            "startTime" : 5,
            "endTime" : 9
        }, 
        {
            "_id" : 1003,
            "name" : "Barclays Project",
            "startTime" : 80,
            "endTime" : 90
        }
    ]
}

文档2:

{
    "_id" : 10439091,
    "demands" : [ 
        {
            "_id" : 1003,
            "name" : "Barclays Project",
            "startTime" : 111,
            "endTime" : 211
        }, 
        {
            "_id" : 1003,
            "name" : "Barclays Project",
            "startTime" : 50,
            "endTime" : 80
        }, 
        {
            "_id" : 1003,
            "name" : "Barclays Project",
            "startTime" : 20,
            "endTime" : 30
        }, 
        {
            "_id" : 1003,
            "name" : "Barclays Project",
            "startTime" : 80,
            "endTime" : 90
        }
    ]
}

本地MongoDb结果:仅限Doc2

CosmosDb结果: Doc1和Doc2

为什么结果不同?有什么想法吗?

我能理解的是,查询根本不适用于CosmosDB。任何替代解决方案都会非常有用。

由于

1 个答案:

答案 0 :(得分:1)

CosmosDB不是MongoDB 。它们是由两个独立公司(MongoDB Inc.的MongoDB和Microsoft的CosmosDB)创建的两个独立产品。

尽管CosmosDB尝试提供类似MongoDB的查询语法,但它们并不相同,可能会产生不同的结果,这在您的体验中很明显。

如果您通过查询真正的MongoDB服务器获得正确的数据,我认为您的查询没有任何问题。

如果您发现CosmosDB给出了错误的结果,那么最好的做法是:

  1. 与Microsoft支持部门联系并询问他们提供不同结果的原因
  2. 部署您自己的MongoDB安装或使用托管的MongoDB,例如: Atlas