【发布时间】:2015-10-30 21:04:24
【问题描述】:
我是 mongoDB 的新手,使用版本 2.6.4。我一直在编写 mongo 查询并在这里寻求专家的帮助。
我在 myCollection 中有以下示例文档:
{ msgID: "1011",
journalID: 1,
status: "FLAGGED",
timeSent: ISODate("2015-10-27T03:44:19.359Z") },
{ msgID: "1012",
journalID: 1,
status: "FLAGGED",
timeSent: ISODate("2015-10-28T07:12:03.446Z") },
{ msgID: "1012",
journalID: 2,
status: "INITIATED",
timeReceived: ISODate("2015-10-28T08:06:21.221Z") },
{ msgID: "1013",
journalID: 1,
status: "FLAGGED",
timeSent: ISODate("2015-10-28T13:21:13.568Z") },
{ msgID: "1013",
journalID: 2,
status: "INITIATED",
timeReceived: ISODate("2015-10-28T13:56:06.419Z") },
{ msgID: "1013",
journalID: 3,
status: "CLOSED",
timeReceived: ISODate("2015-10-28T16:11:38.875Z") },
{ msgID: "1014",
journalID: 1,
status: "FLAGGED",
timeSent: ISODate("2015-10-29T13:21:13.568Z") },
{ msgID: "1015",
journalID: 1,
status: "FLAGGED",
timeSent: ISODate("2015-10-28T08:26:57.828Z") },
{ msgID: "1016",
journalID: 1,
status: "FLAGGED",
timeSent: ISODate("2015-10-28T11:03:09.075Z") },
{ msgID: "1016",
journalID: 2,
status: "CLOSED",
timeReceived: ISODate("2015-10-28T14:19:19.907Z") }
如何编写 mongo 查询,该查询将从 myCollection 中获取满足以下条件的文档:
- 返回所有只有 FLAGGED 状态记录的 msgID(即 排除那些带有 INITIATED 或 CLOSED 条目的 msgID 州)。
- 发送时间
预期结果是:
msgID status timeSent
----- --------- -----------------------------------
1011 FLAGGED ISODate("2015-10-27T03:44:19.359Z")
1015 FLAGGED ISODate("2015-10-28T08:26:57.828Z")
我知道在 SQL 中这可以通过以下查询来实现:
SELECT m1.msgID, m1.status, m1.timeSent
FROM myCollection m1
WHERE m1.msgID NOT IN
( SELECT m2.msgID FROM myCollection m2 WHERE m2.status IN ('INITIATED', 'CLOSED'))
AND m1.status = "FLAGGED"
AND m1.timeSent < "10-29-2015 00:00:00"
任何帮助将不胜感激。
【问题讨论】:
-
更重要的是,如果您查看并理解此处给出的 SQL 查询,甚至不需要子查询,真正的查询只需要查找状态“FLAGGED”和范围。所以这里的教训是不要试图重现写得不好的 SQL 的动作,而要解决数据选择的问题。
-
一个 msgID 可以有多个记录,状态为“FLAGGED”、“INITIATED”、“CLOSED”......等等。我不希望那些有任何记录为“INITIATED”或“CLOSED”的msgID,因此这个子查询过滤掉那些msgID。
-
子查询基本上是一个“连接”,MongoDB 不会以任何方式执行连接。这不是一个好的设计,因为当前 SQL 只是查找并排除与排除值匹配的 所有 文档/记录。逻辑前提是“FLAGGED”是第一位的,所以任何超过一个状态的东西都应该被排除在外。使用“状态”更改的“数组”而不是集合中的单独对象来对此进行建模可能会更好。查询就变得很简单了。
-
@Blakes Seven 同意你的观点,我需要更改模型以在数组级别为每个 msgID 捕获日志详细信息。谢谢。
标签: mongodb