mongodb:从单个文档中值在某个范围内的对象数组中获取子数组



我所拥有的:

  • mongodb集合,例如collection1
  • collection1包含两列,即iddata
  • idint,但扭曲是data是一个对象数组,它的键是字符串但是数字
  • collection1只包含一个文档(为了这个问题(

集合1

{
"_id" : 1,
"data" : [ 
{
"k1" : "001",
"k2" : "v1"
}, 
{
"k1" : "002",
"k2" : "v2"
}, 
{
"k1" : "004",
"k2" : "v3"
}, 
{
"k1" : "010",
"k2" : "v4"
}, 
{
"k1" : "015",
"k2" : "v5"
}
]
}

我想要的:

我想从包含_id = 1的文档中,从data数组中提取所有包含k1003012的对象

我在互联网上搜索到的内容:

我在mongo$match, $project, $filter等中了解了聚合函数。我对mongo还很陌生,无法获得聚合背后的直觉。

我知道我可以通过自定义函数来实现这一点,但它会包含一个for循环,这将影响性能。一定有更好的方法来实现它,但我无法弄清楚。

注意:我也想用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"
}
]
}

相关内容

  • 没有找到相关文章

最新更新