【问题标题】:MongoDB aggregation result differenceMongoDB聚合结果差异
【发布时间】: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


【解决方案1】:

这实际上只是一个简单的查询,因为 MINUS 只是进行“排除”,而您真正要说的一切归结为“根据这些条件排除前 10 个结果”

db.scratch.find({ "date": { "$lt": new Date() }, "flag": true })
  .sort({ "date": -1 }).skip(10);

所以“限制前 10 个,然后从整体中排除这些结果” 基本上减少到 SKIP,在相同的标准上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多