在$ lookup MONGO

时间:2019-05-08 08:33:58

标签: php mongodb

我有一个查询,希望从1000万条记录中获取数据。现在,我在查询中使用$ lookup来从其他集合中获取数据,我只想对$ lookup成功执行的那些结果执行$ match,即$ lookup数组不为空。

下面是我到目前为止写的查询。

[
  '$match'=>[
    '$text'=>[
      '$search'=>$query
    ]
  ]
],
[
  '$lookup'=>[
    'from'=>'library_books',
    'localField'=>'_id',
    'foreignField'=>'product_id',
    'as'=>'library_data'
  ]
],
[
  '$match'=>[
    'library_data'=>[
      '$exists'=>true,
      '$not'=>[
        '$size'=>0
      ]
    ]
  ]
],
[
  '$unwind'=>'$library_data'
],
[
  '$match'=>[
    'library_data.library_id'=>$library_id,
    'library_data.status'=>1
  ]
],
[
  '$limit'=>5,
  
],
[
  '$sort'=>[
    'library_data.status'=>-1,
    'library_data.out'=>1,
    
  ]
],

请注意,我已经使用

在其他集合上创建了索引

db.library_books.createIndex({library_id:1,status:1});

但是查询仍然需要3秒钟的时间来执行,因此有可能将查询时间进一步缩短到400ms左右。

1 个答案:

答案 0 :(得分:1)

看起来索引应该在product_id上。这就是您在library_books集合中查找的字段。

db.library_books.createIndex( { product_id: 1 } );