Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB部分索引不';我不能使用$elemMatch_Mongodb - Fatal编程技术网

MongoDB部分索引不';我不能使用$elemMatch

MongoDB部分索引不';我不能使用$elemMatch,mongodb,Mongodb,我有以下文件: 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: FA

我有以下文件:

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"}}}}
我总是使用
explain()
进行完整的文档扫描
COLLSCAN
。我猜过滤器需要严格遵循
transactions.condition:“FAILED”
,但我认为
{“transactions”:{$elemMatch:{“condition:{“FAILED”}}
的表达式与
transactions.condition:“FAILED”
相同,如果只执行一个表达式。我在这里遗漏了什么?

是的,试试这个:

db.user.explain().aggregate({$match: {"transactions.condition": "FAILED"}})
原因是MongoDB没有为您构建索引。它必须是一个


如果您可以将查询减少到:

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

但这里可能不是这样。

明白了。但是,如果我想索引类似于
{“transactions”:{$elemMatch:{“condition”:“FAILED”,“amount”:{$gt:10}
,该怎么办呢。使用部分索引是否可能?我不这么认为,这就是原因:如果您在
事务.condition
上创建索引,mongodb将使用该索引集合并获取
\u id
s。接下来它说,“好的,在这个子集上过滤数量>10”。那很好。但你也会问:“我需要你记住数组中项目的索引”;所以在我看来这是不可能的@夢のの夢. 您可以尝试$map或$filter;我在本地做了,但那需要扫描。子文档数组中的索引有问题。但是tbh,您的问题已经得到了回答@夢のの夢不确定记忆索引部分,认为如果mongo的数组字段包含任何满足
elemMatch
的元素,mongo将索引文档。但是是的,我会在另一个帖子里问。谢谢