提高mongo查询性能(使用Sub查询)

时间:2019-01-11 06:16:23

标签: java sql mongodb mongodb-query aggregation-framework

两个文档可以具有相同的IMAGE_CONTENT_INSTANCE_HANDLE,状态可以是BOOKEDRELEASED 但我希望所有图像实例的句柄都只有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());
}

我想在单个mongo查询中实现此目标,例如以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"
}

我的查询应仅返回最后一个文档的句柄。即,仅具有RELEASED状态的文档。我被卡住了,非常感谢您提出的改进建议。

1 个答案:

答案 0 :(得分:1)

从您的问题中,我了解到您希望所有状态=“已发布”和“状态”!=“书本”,我认为您写的有点不对。

MongoDB查询:

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

还要通过mognodb docs 希望对您有所帮助。我也是mongodb的新手,如果有错误,请更正。