基于某个字段值排除记录的MongoDB查询

4

我有一个票务系统,每个票号都有多个版本/文档。当最后一个文档的状态为“closed”时,该票将被视为关闭。我需要找出所有未关闭的票。以下是SQL查询:

SELECT * FROM tickets t WHERE NOT EXISTS ( SELECT 1 FROM documents d WHERE d.ticket_id = t.id AND d.status = 'closed' )
select distinct(id) from tickets where id not in (select id from tickets where status = 'closed');

在MongoDB中,相应的查询是什么?

以下是一个票据文档的示例。

{
    "id" : 100,
    "timestamp": 1427863300000,
    "status" : "open",
    "description": "abc",
    "comments": "pqr"
    "assigned_to": "xyz"
}

可能会有几个与同一票号相关的文档,这是为了保留票据的历史记录。应用程序允许用户在历史模式下查看票务详细信息。当数据库中插入具有相同ID但状态为“已关闭”的文档时,该票证被视为关闭。

{
    "id" : 100,
    "timestamp": 1429200480000,
    "status" : "closed",
    "description": "abc",
    "comments": "pqr"
    "assigned_to": "xyz"
}

我希望查询不含有status=closed的任何文档的唯一票据ID。

你在MongoDB中已经尝试了什么?同时,请提供一份你的tickets集合中的样本MongoDB文档。 - joao
1个回答

5
你需要使用 db.collection.distinct() 方法。为了检索出 "id" 在 'status' 不是 'closed' 的文档中,你需要使用 $ne 运算符。
db.collection.distinct( 'id', { 'status': { '$ne': 'closed' } } )

我尝试了上述查询。我的问题是要过滤掉所有最后一个文档状态为“closed”的ID的文档。例如,一个工单ID有10个文档(版本)。只有当最后一个版本的“状态”更新为“closed”时,该工单才被视为“打开”。上述查询返回前9个文档。 - Ravi Singal
@RaviSingal,您能否使用编辑链接在您的问题中添加样本文档并提供期望的结果? - styvane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接