首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何过滤产品,优化mongodb查询?

如何过滤产品,优化mongodb查询?
EN

Stack Overflow用户
提问于 2021-08-11 12:35:03
回答 2查看 69关注 0票数 1

如何过滤产品和优化mongodb查询,

我们想得到流行的产品,根据一些条件,即产品是订单,viewlikes

代码语言:javascript
复制
db.products.aggregate([
  {
    "$lookup": {
      "from": "orders",
      "localField": "_id",
      "foreignField": "product_id",
      "as": "orders"
    }
  },
  {
    "$addFields": {
      "orderCount": {
        "$size": {
          "$cond": [
            {
              "$isArray": "$orders"
            },
            "$orders",
            []
          ]
        }
      }
    }
  },
  {
    "$addFields": {
      "likeCount": {
        "$size": {
          "$cond": [
            {
              "$isArray": "$likes"
            },
            "$likes",
            []
          ]
        }
      }
    }
  },
  {
    "$addFields": {
      "sumCount": {
        "$sum": [
          "$orderCount",
          "$likeCount",
          "$view"
        ]
      }
    }
  },
  {
    $sort: {
      "sumCount": -1
    }
  }
])

https://mongoplayground.net/p/fIG3-yHGuV6

必须使用多个$addFields,才能实现拥有最多orderslikesviews的产品。请指点

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-11 15:26:27

我建议进行两次修正,

  1. 如果订单大小是数组或非条件,则不需要验证,因为$lookup阶段总是在数组中返回。
  2. 您可以在一个单一的orderCount阶段对likeCount$addFields进行两种操作。

你最后的疑问是,

代码语言:javascript
复制
db.products.aggregate([
  {
    "$lookup": {
      "from": "orders",
      "localField": "_id",
      "foreignField": "product_id",
      "as": "orders"
    }
  },
  {
    "$addFields": {
      "orderCount": { "$size": "$orders" },
      "likeCount": {
        "$size": {
          "$cond": [{ "$isArray": "$likes" }, "$likes", []]
        }
      }
    }
  },
  {
    "$addFields": {
      "sumCount": {
        "$sum": ["$orderCount", "$likeCount", "$view"]
      }
    }
  },
  { "$sort": { "sumCount": -1 } }
])

游乐场

票数 1
EN

Stack Overflow用户

发布于 2021-08-11 13:26:19

您还可以使用投影将代码最小化。

代码语言:javascript
复制
{
    "$project": {
      "likes": 1,
      "orderCount": {
        "$size": {
          "$cond": {
            "if": {
              "$isArray": [
                "$orders"
              ]
            },
            "then": "$orders",
            "else": []
          }
        }
      },
      "likeCount": {
        "$size": {
          "$cond": {
            "if": {
              "$isArray": [
                "$likes"
              ]
            },
            "then": "$likes",
            "else": []
          }
        }
      },
      "views": {
        "$ifNull": [
          "$view",
          0
        ]
      }
    }
  },

-PN

去蒙古操场看看。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68742147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档