Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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_Mongoose_Mongodb Query - Fatal编程技术网

Mongodb 从$elemMatch查询返回数组索引

Mongodb 从$elemMatch查询返回数组索引,mongodb,mongoose,mongodb-query,Mongodb,Mongoose,Mongodb Query,假设我有一份这样的文件 { title : 'myTitle', favorites : [{name : 'text', number : 6}, {name : 'other', number : 4}] } 我想返回从收藏夹数组中检索嵌入文档的数组索引(如果有) 假设我有以下问题 {title : 'myTitle'} 投影呢 {favorites : {$elemMatch : {name : 'text', number : 6} }} 如果投影返回文档,并且包含一个

假设我有一份这样的文件

{
  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
,则可以使用操作符和
aggregate
,而不是执行
find()

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


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

除非我误解了您的要求,否则在多个事务的情况下,根据索引更新数组条目存在一种风险。假设您已检索到要在文档中更新的数组索引,随后另一个事务将从此文档中删除数组元素。在这种情况下,您的索引可能指向错误的元素,这可能会导致更新文档中的数组元素。我理解,但是不会复制任何数组项,也不会从数组中删除任何项。
db.collection.aggregate([
{$match:{"favorites.name":"text","favorites.number":6}},
{$unwind:{"path":"$favorites","includeArrayIndex":"index"}},
{$match:{"favorites.name":"text","favorites.number":6}}
])