从$ elemMatch查询返回数组索引

时间:2015-12-18 02:56:33

标签: mongodb mongoose mongodb-query

说我有这样的文件

{
  title : 'myTitle',
  favorites : [{name : 'text', number : 6}, {name : 'other', number : 4}]
}

我想从收藏夹数组中检索嵌入文档的位置返回数组索引(如果有)。

说我有以下查询

 {title : 'myTitle'}

和投影

 {favorites : {$elemMatch : {name : 'text', number : 6} }}

如果投影返回文档并且它包含带子文档的收藏夹数组,是否有办法知道找到子文档的索引?在这种情况下,索引为0。

我希望索引的原因是因为只要我检索文档,我就会继续更新它,如果我有一个特定的索引要更新而不是再次使用$elemMatch,它会提高性能会导致mongo遍历所有数组条目,直到找到匹配的文档。

1 个答案:

答案 0 :(得分:0)

不幸的是,使用$elemMatch运算符是不可能的。如果您使用的是mongodb 3.2,则可以使用$unwind运算符和aggregate代替find()

db.collection.aggregate([
{$match:{"favorites.name":"text","favorites.number":6}},
{$unwind:{"path":"$favorites","includeArrayIndex":"index"}},
{$match:{"favorites.name":"text","favorites.number":6}}
])

将返回文档,其数组索引位于字段中 - index。如果您想要整个文档以及其他数组元素,则必须$group$unwind而不是$match

对于以前的版本,在客户端迭代数组,获取子文档的索引将是最佳选择。