两个文档可以具有相同的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状态的文档。我被卡住了,非常感谢您提出的改进建议。
答案 0 :(得分:1)
从您的问题中,我了解到您希望所有状态=“已发布”和“状态”!=“书本”,我认为您写的有点不对。
MongoDB查询:
db.inventory.find({'state' : 'RELEASED'}})
还要通过mognodb docs 希望对您有所帮助。我也是mongodb的新手,如果有错误,请更正。