我所拥有的:
mongodb
集合,例如collection1
collection1
包含两列,即id
和data
id
是int
,但扭曲是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
数组中提取所有包含k1
、003
和012
的对象
我在互联网上搜索到的内容:
我在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"
}
]
}