首页 > 解决方案 > MongoDB 部分索引不适用于 $elemMatch

问题描述

我有以下文件:

user{
  _id: objId(..),
  name: "John Doe",
  transactions:[
    {
      _id: 1,
      amount: 10.00
      item_id: 123,
      condition: SUCCESS 
    },
    {
      _id: 2,
      amount: 5.00
      item_id: 124,
      condition: FAILED
    }
    ..
  ]
  ..
}

我尝试使用以下方法为失败的交易放置部分索引:

db.user.createIndex(
   { "transactions.condition": 1 },
   { partialFilterExpression: {"transactions.condition": "FAILED"} }
)

但是,每当我通过聚合管道进行查询或 $match 时,以下内容:

{$match: {"transactions": {$elemMatch: {"condition": "FAILED"}}}}

我总是COLLSCAN使用explain(). 我猜过滤器需要严格遵循的表达式transactions.condition: "FAILED",但我认为如果你只做一个表达式是一样{"transactions": {$elemMatch: {"condition": "FAILED"}}}的。transactions.condition: "FAILED"我在这里想念什么?

标签: mongodb

解决方案


是的,试试这个:

db.user.explain().aggregate({$match: {"transactions.condition": "FAILED"}})

原因是 MongoDB 不会为您构建索引。它必须是一个key.


如果您可以将其减少为:您将获得更快的查询:

db.user.explain().aggregate([
{$match: {"transactions.condition": "FAILED"}},
{$project:{_id:0, transactions.condition:1}}
])

但这里可能不是这样。


推荐阅读