java - 提高 mongo 查询性能(使用子查询)

标签 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 状态。我被卡住了,我非常感谢您改进这一点的想法。

最佳答案

从您的问题中,我了解到您希望所有状态='已发布'和状态!='预订',我认为您写得有点不正确。

MongoDB 查询:

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

另请浏览mognodb docs 希望对你有帮助。我也是mongodb新手,如有错误请指正。

关于java - 提高 mongo 查询性能(使用子查询),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54141282/

相关文章:

java - 'synchronized barriers' 是什么?

sql - 有没有办法通过 SQL (MySQL) 获取第一个事件位?

spring - @DataMongoTest 正在创建一个空的 MongoTemplate

python - 具有 Python 的 "set()"类型的 Mongodb

java - 用于响应的 HTML 解析器 - Java

java - 如何通过 switch 提供在线商店中的产品列表?如何使用退出到主菜单? (或其他方式)

java - 拒绝前导/结尾非字母数字字符的字边界

sql - 执行匿名 block PlSQL 失败

SQL语句从 'next'行中选择信息,最后一条记录丢失

基于unix时间戳的mongodb按天聚合