【发布时间】:2017-11-08 23:07:28
【问题描述】:
我正在尝试编写查询以查找集合中具有“日期”剩余文档(满足日期和标志条件)以执行更新。 SQL 等效项是:
SELECT * FROM TABLE
WHERE DATE < SYSDATE
AND FLAG = TRUE
MINUS
SELECT * FROM TABLE
WHERE DATE < SYSDATE
AND FLAG = TRUE
ORDER BY DATE DESC
LIMIT 10
到目前为止我有:
db.scratch.aggregate(
[
{ $match: { flag: true, date: { $lt: new Date() } } },
{ $sort: { date: -1 } },
{ $limit: 10 }
]
)
是否可以在数据库中进行减法,或者我唯一的选择是在客户端处理两个查询的结果?
【问题讨论】:
-
这不是简单的
.find({ "date": { "$gt": new Date() }, "flag": false }).sort({ "date": -1 }).limit(10)吗?MINUS是“排除”,因此在“同一个集合/表”上,它的意思只是“颠倒逻辑条件”。所以这是非常糟糕的 SQL,只是为了它而使一个简单的语句过于复杂。不要坚持坏代码,而是改正它。 -
@NeilLunn 抱歉,我没有正确指定要求。请查看更新的描述和查询。基本上,我希望得到所有满足日期和标志条件的文档,除了最新的前 10 名。
-
然后使用
.skip(10)而不是limit(10)。并且“不要颠倒”运营商。限制的倒数简单地说就是Skip。 MINUS 在这里没有位置,在 MongoDB 中也没有在也可以简化的原始查询中。 -
@NeilLunn 谢谢,这就是我一直在寻找的! :) 如果你愿意,请把它作为我接受它的答案。
标签: mongodb nosql aggregation-framework nosql-aggregation