javascript - 返回某种类型的有限数量的记录,但返回无限数量的其他记录?

标签 javascript php mongodb mapreduce aggregation-framework

我有一个查询,需要返回 10 条“A 类”记录,同时返回所有其他记录。我怎样才能做到这一点?

更新: 诚然,我可以通过两个查询来完成此操作,但如果可能的话,我想避免这种情况,因为我认为这样会减少开销,并且可能会提高性能。我的查询已经是一个聚合查询,同时考虑了两种记录,我只需要限制结果中一种类型记录的数量即可。

更新:以下是突出显示问题的示例查询:

db.books.aggregate([
    {$geoNear: {near: [-118.09771, 33.89244], distanceField: "distance", spherical: true}},
    {$match:    {"type": "Fiction"}},
    {$project:  {
        'title': 1,
        'author': 1,
        'type': 1,
        'typeSortOrder': 
            {$add: [
                {$cond: [{$eq: ['$type', "Fiction"]}, 1, 0]},
                {$cond: [{$eq: ['$type', "Science"]}, 0, 0]},
                {$cond: [{$eq: ['$type', "Horror"]}, 3, 0]}
        ]},
    }},
    {$sort: {'typeSortOrder'}},
    {$limit: 10}
])

db.books.aggregate([
    {$geoNear: {near: [-118.09771, 33.89244], distanceField: "distance", spherical: true}},
    {$match:    {"type": "Horror"}},
    {$project:  {
        'title': 1,
        'author': 1,
        'type': 1,
        'typeSortOrder': 
            {$add: [
                {$cond: [{$eq: ['$type', "Fiction"]}, 1, 0]},
                {$cond: [{$eq: ['$type', "Science"]}, 0, 0]},
                {$cond: [{$eq: ['$type', "Horror"]}, 3, 0]}
        ]},
    }},
    {$sort: {'typeSortOrder'}},
    {$limit: 10}
])

db.books.aggregate([
    {$geoNear: {near: [-118.09771, 33.89244], distanceField: "distance", spherical: true}},
    {$match:    {"type": "Science"}},
    {$project:  {
        'title': 1,
        'author': 1,
        'type': 1,
        'typeSortOrder': 
            {$add: [
                {$cond: [{$eq: ['$type', "Fiction"]}, 1, 0]},
                {$cond: [{$eq: ['$type', "Science"]}, 0, 0]},
                {$cond: [{$eq: ['$type', "Horror"]}, 3, 0]}
        ]},
    }},
    {$sort: {'typeSortOrder'}},
    {$limit: 10}
])

我希望在一个查询中返回所有这些记录,但将类型限制为任何类别的最多 10 条记录。 我意识到,当查询像这样分解时, typeSortOrder 不需要是有条件的,最初当查询是一个查询时(这就是我想回到的地方),我就在那里了。

最佳答案

我认为目前(2.6)不可能用一个聚合管道来实现这一点。很难给出一个准确的论据来解释为什么不这样做,但基本上聚合管道执行文档流的转换,一次一个文档。管道内不知道流本身的状态,这是您需要确定是否已达到 A、B 等的限制并且需要删除更多相同类型的文档。 $group 确实将多个文档组合在一起,并允许它们的字段值聚合来影响生成的组文档($sum$avg 等)。 )。也许这有一定道理,但不一定严格,因为您可以添加一些简单的操作来实现基于类型的限制,例如,向 $ 添加一个 $push x 累加器group 仅当被推送到的数组少于 x 个元素时才会推送值。

即使我确实有办法做到这一点,我也建议只进行两次聚合。保持简单。

关于javascript - 返回某种类型的有限数量的记录,但返回无限数量的其他记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25040792/

相关文章:

javascript - 给定 ISO 8601 日期/时间,如何使用 JS date() 获取星期几 (0-6)?

javascript - HowlerJS 步骤函数不会更新搜索时的范围输入值

php - 创建指向 google play 应用程序下载的直接链接

php - MongoDB 最佳性能——有多少个持久连接

spring - 在 Spring MVC 中,如何在同一个项目中连接到两个数据库(Mysql 数据库和 MongoDB)?如果可能的话

javascript - d3.js zoom.translate 向量的单位是什么?

javascript - 更改 Bootstrap Datepicker 的语言

javascript - 使用 AJAX 发送多张图片

php - 使用数组更新 MySQL

php - MongoDB 列入黑名单的 fatal error