Mongodb聚合查询性能较差

问题描述

我正在尝试进行汇总复杂查询。但是查询需要4-5秒。其实没有多少数据,但我必须使用5个查询。我的查询如下;

db.getCollection("pairpercentages").explain('executionStats').aggregate([
      {
        $match: {
          percentage: {
            $gt: 0,},updatedate: {
            $gte: ISODate("2020-08-13T09:52:51.427+03:00"),{
        $lookup: {
          from: "filtereditems",let: {
            pair_src: "$pair",buy_src: "$buy",sell_src: "$sell",percentage_src: "$percentage",buycontractaddress_src: "$buycontractaddress",sellcontractaddress_src: "$sellcontractaddress",pipeline: [
            {
              $match: {
                $and: [
                  {
                    $expr: {
                      $or: [
                        {
                          $eq: ["$$pair_src","$pair"],{
                          $eq: ["$pair","ALL"],],{
                    $expr: {
                      $or: [
                        {
                          $eq: ["$$buy_src","$buy"],{
                          $eq: ["$buy",{
                    $expr: {
                      $or: [
                        {
                          $eq: ["$$sell_src","$sell"],{
                          $eq: ["$sell",{
                    $expr: {
                      $lt: ["$$percentage_src","$percentage"],{
                    $expr: {
                      $or: [
                        {
                          $eq: ["$contractaddress",""]
                        },{
                          $eq: ["$$buycontractaddress_src","$contractaddress"],{
                          $eq: ["$$sellcontractaddress_src",{
                          $eq: ["$contractaddress",as: "filtered",{
        $match: {
          filtered: {
            $eq: [],{
        $lookup: {
          from: "alarmitems",pipeline: [
            {
              $match: {
                $expr: {
                  $and: [
                    {
                      $eq: ["$$pair_src",{
                      $eq: ["$$buy_src",{
                      $eq: ["$$sell_src",as: "specialAlarmfilterCounter",{
        $addFields: {
          specialAlarmFilterExists: {
            $cond: {
              if: { $gt: [{ $size: "$specialAlarmfilterCounter" },0] },then: true,else: false,specialAlarmFilterExists: "$specialAlarmFilterExists",{
                      $gt: ["$$percentage_src",as: "specialAlarmfilter",{
        $addFields: {
          specialAlarm: {
            $cond: {
              if: {
                $and: [
                  { $gt: [{ $size: "$specialAlarmfilter" },{ $eq: ["$specialAlarmFilterExists",true] },then: 1,else: 0,pipeline: [
            {
              $match: {
                $and: [
                  {
                    $expr: {
                      $or: [
                        {
                          $eq: ["$$specialAlarmFilterExists",false],{
                    $expr: {
                      $or: [
                        {
                          $eq: ["$$pair_src",as: "alarmfilterCounter",{
        $addFields: {
          allAlarmFilterExists: {
            $cond: {
              if: { $gt: [{ $size: "$alarmfilterCounter" },allAlarmFilterExists: "$allAlarmFilterExists",{
                    $expr: {
                      $gt: ["$$percentage_src",{
                    $expr: {
                      $eq: ["$$allAlarmFilterExists",true],as: "alarmfilter",{
        $addFields: {
          allAlarm: {
            $cond: {
              if: { $gt: [{ $size: "$alarmfilter" },{
        $match: {
          $or: [
            {
              $and: [
                { percentage: { $gt: 0 } },{ specialAlarmFilterExists: { $eq: false } },{ allAlarmFilterExists: { $eq: false } },{ specialAlarm: { $gt: 0 } },{ allAlarm: { $gt: 0 } },{
        $project: {
          alarmfilter: 0,filtered: 0,specialAlarmfilter: 0,specialAlarm: 0,specialAlarmFilterExists: 0,allAlarm: 0,alarmfilter: 0,allAlarmFilterExists: 0,specialAlarmfilterCounter: 0,alarmfilterCounter: 0,updatedate: 0,buydate: 0,selldate: 0,buycontractaddress: 0,sellcontractaddress: 0,buymultiple: 0,sellmultiple: 0
        },{ $sort : { percentage : 1} }
    ])

我为配对百分比,过滤和警报文档创建索引,如下所示。

db.pairpercentages.createIndex( { percentage: 1,updatedate: 1,pair: 1,buy: 1,sell: 1} );
db.pairpercentages.createIndex( { percentage: 1,updatedate: 1} );
db.filtereditems.createIndex( { buy: 1,sell: 1,user: 1,percentage: 1,contractaddress:1} );
db.alarmitems.createIndex( { buy: 1,user:1,contractaddress:1} );

但是当我查看执行统计信息时,我发现它花费了太多时间,如下所示。

"executionStats" : {
                    "executionSuccess" : true,"nReturned" : 3298.0,"executionTimeMillis" : 4432.0,"totalKeysexamined" : 3298.0,"totalDocsexamined" : 3298.0,

我在哪里做错了?我该怎么解决

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)