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将索引文档。但是是的,我会在另一个帖子里问。谢谢