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

Mongodb 使用$elemMatch查询数组索引

Mongodb 使用$elemMatch查询数组索引,mongodb,mongoose,Mongodb,Mongoose,我的收藏结构如下: "data":[ [ ISODate("2018-10-01T03:45:00.000Z"), 752.5, 752.9, 746.5, 746.5, ], [ ISODate("2018-10-02T03:46:00.000Z"), 746.

我的收藏结构如下:

"data":[ 
        [ 
            ISODate("2018-10-01T03:45:00.000Z"), 
            752.5, 
            752.9, 
            746.5, 
            746.5, 
        ], 
        [ 
            ISODate("2018-10-02T03:46:00.000Z"), 
            746.5, 
            750.9, 
            746.5, 
            749.95, 
        ],...
     ]
如何查询集合,以便只返回“data”数组的那些子数组,其中特定索引处的元素与特定条件匹配

例如,要查找索引1处的元素大于“750”的数组


显然,这是行不通的,因为“$[1]”不是指定索引1的正确方法,所以我应该用什么来替换它?

获取此值并匹配特定索引的一种方法(在本例中为
1
)是:

db.collection.find({
  "data": {
    "$elemMatch": {
      "1": {
        "$gte": 750
      }
    }
  }
},
{
  "data.$": 1
})
看到了吗

如果您不关心索引,只想检查其值是否大于
750

db.collection.find({
  "data": {
    "$elemMatch": {
      "$elemMatch": {
        "$gte": 750
      }
    }
  }
},
{
  "data.$": 1
})
看到这个了吗

要获取多用途聚合,因为使用$elemMatch无法获取多个值:

db.collection.aggregate([
  {
    $unwind: "$data"
  },
  {
    $match: {
      "data": {
        $gte: 740
      }
    }
  }
])
这个解决方案终于对我起作用了。它给出了所有匹配的嵌套子数组

解释

$addFields用于在输出中添加字段,但是我们也可以使用它覆盖将在输出中的现有字段。因此,由于输出中的数据字段将包含所有数组,因此我们用一个新的数据字段替换数据字段,该数据字段只包含符合给定条件的数组

$filter用于此目的,从给定的数组集,它将只返回满足cond参数中描述的条件的数组


由于数组没有任何标识符/键,我们使用$arrayElemAt获取数组中给定索引处的值,然后使用常规查询参数进行条件筛选。执行此操作后,只返回满足条件的数组。

如何获得满足查询条件的多个数组?我有一个非常接近的问题,但我需要使用$convert运算符进行数值比较b/c我将值存储为字符串。我该怎么做?
db.collection.aggregate([
  {
    $unwind: "$data"
  },
  {
    $match: {
      "data": {
        $gte: 740
      }
    }
  }
])
db.collection.aggregate([
  {
    $addFields: {
      "data": {
        $filter: {
          input: "$data",
          as: "d",
          cond: {
            $gte: [
              { $arrayElemAt: [ "$$d", 1] },
              750
            ]
          }
        }
      }
    }
  }
])