mongo db : 从 objects 的数组中获取子数组,其值在单个文档的范围内
mongo db : get sub array from an array of objects with values within a range in a single document
我有:
- A
mongodb
collection, 说 collection1
collection1
包含两列,即。 id
和 data
id
是 int
但扭曲是 data
是 objects 和 的数组,它的键是字符串但数字
collection1
包含只有一个文档(为了这个问题)
collection1
{
"_id" : 1,
"data" : [
{
"k1" : "001",
"k2" : "v1"
},
{
"k1" : "002",
"k2" : "v2"
},
{
"k1" : "004",
"k2" : "v3"
},
{
"k1" : "010",
"k2" : "v4"
},
{
"k1" : "015",
"k2" : "v5"
}
]
}
我想要的:
我想从 data
数组中获取所有 objects,其中 k1
从 003
到 012
都包括在内,来自文档 _id = 1
我在互联网上搜索的结果:
我在 mongo
和 $match, $project, $filter
等中了解了聚合函数。我是 mongo
的新手,无法获得聚合背后的直觉。
我知道我可以通过自定义函数实现这一点,但它会包含一个会影响性能的 for 循环。必须有更好的方法来实现它,但我无法弄清楚。
Note: I also want to achieve the same with pymongo
抱歉,我不知道 pymongo
但下面的查询是基本思路(只要将所有 MongoDB 运算符放在双引号内 ""
直接使用此查询就可以了):
试试这个:
db.collection1.aggregate([
{
"$match": { "_id": 1 }
},
{
"$addFields": {
"data": {
"$filter": {
"input": "$data",
"as": "item",
"cond": {
"$and": [
{ "$gte": [{ "$toInt": "$$item.k1" }, 3] },
{ "$lte": [{ "$toInt": "$$item.k1" }, 12] }
]
}
}
}
}
}
]);
输出:
{
"_id" : 1,
"data" : [
{
"k1" : "004",
"k2" : "v3"
},
{
"k1" : "010",
"k2" : "v4"
}
]
}
我有:
- A
mongodb
collection, 说collection1
collection1
包含两列,即。id
和data
id
是int
但扭曲是data
是 objects 和 的数组,它的键是字符串但数字collection1
包含只有一个文档(为了这个问题)
collection1
{
"_id" : 1,
"data" : [
{
"k1" : "001",
"k2" : "v1"
},
{
"k1" : "002",
"k2" : "v2"
},
{
"k1" : "004",
"k2" : "v3"
},
{
"k1" : "010",
"k2" : "v4"
},
{
"k1" : "015",
"k2" : "v5"
}
]
}
我想要的:
我想从 data
数组中获取所有 objects,其中 k1
从 003
到 012
都包括在内,来自文档 _id = 1
我在互联网上搜索的结果:
我在 mongo
和 $match, $project, $filter
等中了解了聚合函数。我是 mongo
的新手,无法获得聚合背后的直觉。
我知道我可以通过自定义函数实现这一点,但它会包含一个会影响性能的 for 循环。必须有更好的方法来实现它,但我无法弄清楚。
Note: I also want to achieve the same with
pymongo
抱歉,我不知道 pymongo
但下面的查询是基本思路(只要将所有 MongoDB 运算符放在双引号内 ""
直接使用此查询就可以了):
试试这个:
db.collection1.aggregate([
{
"$match": { "_id": 1 }
},
{
"$addFields": {
"data": {
"$filter": {
"input": "$data",
"as": "item",
"cond": {
"$and": [
{ "$gte": [{ "$toInt": "$$item.k1" }, 3] },
{ "$lte": [{ "$toInt": "$$item.k1" }, 12] }
]
}
}
}
}
}
]);
输出:
{
"_id" : 1,
"data" : [
{
"k1" : "004",
"k2" : "v3"
},
{
"k1" : "010",
"k2" : "v4"
}
]
}