mongodb - 从 $elemMatch 查询返回数组索引

标签 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 遍历所有数组条目,直到找到匹配的文档。

最佳答案

不幸的是,无法使用 $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 中。如果您想要整个文档以及其他数组元素,则必须在 $unwind 而不是 $match 之后添加 $group

对于以前的版本,在客户端迭代数组,并获取子文档的索引是可行的方法。

关于mongodb - 从 $elemMatch 查询返回数组索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34347858/

相关文章:

mongodb - 从 Spring boot 连接 Mongodb Atlas

mongodb - Golang mongodb 驱动程序错误模式验证

java - 用于修改文档子文档属性键的聚合操作

node.js - Express 无法 PUT/DELETE 方法。出了什么问题?

javascript - 为什么 Node 的 mongoose 告诉我 undefined 不是一个函数?

javascript - 我想更新 mongodb 中包含日期时间字段的对象数组

MongoDb 文本搜索不返回结果

arrays - 如何使用 mongodb 中的 $ne 查询来查询值数组?

mongodb - $geoNear 匹配最近的数组

node.js - TypeError : callback. apply 不是allowDiskUse之后的函数