两个文档可以具有相同的 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());
}
我想在单个 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 状态。我被卡住了,我非常感谢您改进这一点的想法。
最佳答案
从您的问题中,我了解到您希望所有状态='已发布'和状态!='预订',我认为您写得有点不正确。
MongoDB 查询:
db.inventory.find({'state' : 'RELEASED'}})
另请浏览mognodb docs 希望对你有帮助。我也是mongodb新手,如有错误请指正。
关于java - 提高 mongo 查询性能(使用子查询),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54141282/