Различия в локальном выполнении MongoDb и CosmosDb - PullRequest
0 голосов
/ 29 мая 2018

Пожалуйста, обратитесь к структуре документа ниже (в разделе «Сборник документов»).Я хочу написать запрос, который даст мне документы, основанные на таймингах спроса, и отфильтрует ресурсы, у которых уже есть требования для данных таймингов, и предоставит мне доступные ресурсы для данной потребности (только на основе таймингов).Каждый ресурс имеет массив спроса с таймингами спроса.

В основном нам нужны документы, которые удовлетворяют условию ниже для каждого вложенного документа в массиве спроса.

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}
                }
            }
        }
    }
)

Сборник документов

Doc1:

{
    "_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
        }
    ]
}

Doc2:

{
    "_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 голосов
/ 30 мая 2018

CosmosDB не является MongoDB .Это два отдельных продукта, созданных двумя отдельными компаниями (MongoDB от MongoDB Inc. и CosmosDB от Microsoft).

Хотя CosmosDB пытается предоставить синтаксис запроса, подобный MongoDB, они не одинаковы и могут создавать разныерезультаты, как видно из вашего опыта.

Я не думаю, что с вашим запросом что-то не так, если вы получаете правильные данные, запрашивая настоящий сервер MongoDB.

Если вы обнаружите, что CosmosDB даетневерный результат, тогда лучшим вариантом будет либо:

  1. Обратиться в службу поддержки Microsoft и узнать, почему они дают другой результат
  2. Развернуть собственную установку MongoDB или использовать размещенную MongoDB, например Атлас
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...