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
]
}
}
}
}
}
])