【问题标题】:Mongo match based on sum of array componentsMongo匹配基于数组组件的总和
【发布时间】:2018-10-21 23:38:00
【问题描述】:

我有以下架构,但无法返回我想要的数据。

var Book = new Schema({
    ISBN: String,
    title: String,
    author: String,
    image: String,
    availability: [{zipcode: String,
                    total: Number,
                    loaned: Number
    }]
});

我想返回一个随机的项目样本(可能是 25 个),其中有可用的项目。在这种情况下,可用性将被定义为总数大于在“可用性”下的至少一个集合中借出的数量(或通过查看所有集合中的总数和借出的总和)。每次我开始,我似乎都撞到了一堵墙。有谁知道这是否可行或如何做到?

【问题讨论】:

  • 您可能需要为此使用aggregation,因为简单的find 根本行不通。您应该能够对文档进行某种投影,以找到其描述大致类似于total > loaned,然后limit 将您的结果变为您想要的数量。请务必查看聚合并研究聚合管道和运算符的工作原理。尝试一下,如果您遇到问题,请使用您迄今为止管理的聚合代码返回一个新问题。届时您将能够获得更多帮助:)
  • 感谢@B.Fleming。我一直在使用聚合,这就是我一直卡住的地方。关于寻找方向的好地方的任何指示?我的模式对我来说很有意义,但我在任何地方的示例中都找不到任何可比较的模式,并且使用数组元素让我有点困惑。任何帮助表示赞赏。
  • 我不确定具体的资源,不幸的是,只有 MongoDB 文档。但我会给你一个提示:$unwind 将帮助你解决处理数组的问题,并允许你单独处理数组元素。有很多像这样有用的运算符。

标签: mongodb mongoose aggregation-framework


【解决方案1】:

我终于通过这样做让它工作了:

db.books.aggregate(
    [
        {
            $addFields: {
                available: {$gt: [{$sum: "$availability.total"}, {$sum: "$availability.loaned"}]}
            }
        },
        {
            $match: {available: true}
        },
        {
            $sample: {size: 25}
        }
    ]
)

我不确定这种方法是否有任何缺点,但通过有限的测试,它似乎对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-05
    • 2021-01-11
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多