Повышение производительности монго-запроса - PullRequest
0 голосов
/ 11 января 2019

Два документа могут иметь одинаковый IMAGE_CONTENT_INSTANCE_HANDLE, а состояние может быть BOOKED или RELEASED но я хочу, чтобы все дескрипторы экземпляров изображения были только RELEASED, В настоящее время я делаю это, запустив два запроса, которые привели к проблемам с производительностью.

{ 
    "state" : "RELEASED"
}

с проекцией {"imageContentInstance.handle": 1}

я перебираю результат, полученный из этого запроса и запускает другой запрос, как показано ниже, и исключает дескрипторы, которые также находятся в состоянии BOOKED, из списка. Таким образом, я получаю дескрипторы только в состоянии RELEASED

while (cursor.hasNext()) {
ICI ici = objectMapper.readValue(result, ICI_COLLECTION_TYPE_REF);
    String result = JSON.serialize(cursor.next());
    try {
        queryDocument =  { "imageContentInstance.handle" : ici.getImageContentInstance().getHandle() , "state" : "BOOKED"}
        Document bookedDoc = iciDAO.findOne(queryDocument);
        if (null != bookedDoc)
            LOGGER.debug("Calling continue and skipping booked state ");
        continue;
    }
    iciHandles.add(ici.getImageContentInstance().getHandle().toString());
    LOGGER.debug("ImageInstanceHandle is added to the lisr and the lise is "+iciHandles.size());
}

Я хочу добиться этого в одном монго-запросе в качестве примера запроса, написанного на SQL, чтобы повысить производительность. Я действительно ценю ваши комментарии.

SELECT *
FROM ici i
WHERE i.state = 'RELEASED'
AND NOT EXISTS
  (SELECT * FROM ici ic WHERE ic.handle = i.handle AND ic.state = 'BOOKED'
  );

пример: Предположим, что документы указаны ниже

{
    "_id" : ObjectId("58c9f524fa8cd6a517cf5ddf"),
    "imageContentInstance" : {
        "handle" : "ICI:1234",
        "key" : null,
        }
    "instanceHandle" : "LCI:RNBM12",
    "state" : "BOOKED",
}

{
    "_id" : ObjectId("58c9f524fa8cd6a517cf5ddf"),
    "imageContentInstance" : {
        "handle" : "ICI:1234",
        "key" : null,
        }
    "instanceHandle" : "LCI:RNBM13",
    "state" : "RELEASED",
}


{
    "_id" : ObjectId("58c9f524fa8cd6a517cf5ddf"),
    "imageContentInstance" : {
        "handle" : "ICI:456",
        "key" : null,
        }
    "instanceHandle" : "LCI:RNBM14",
    "state" : "RELEASED"
}

Мой запрос должен возвращать дескриптор только одного последнего документа .ie, документа со статусом только со статусом RELEASED. Я застрял, я действительно ценю ваши идеи по улучшению этого.

1 Ответ

0 голосов
/ 14 января 2019

Из вашего вопроса я понимаю, что вы хотите, чтобы все состояние = 'Выпущено' и состояние! = 'ЗАБРОНИРОВАНО', которое, как мне кажется, вы написали немного неправильно.

Запрос MongoDB:

db.inventory.find({'state' : 'RELEASED'}})

Также просмотрите mognodb документы Я надеюсь, что это поможет. Я также новичок в mongodb, если есть ошибка, пожалуйста, исправьте ее.

...