mongo db:从对象数组中获取子数组,其值在单个文档的范围内
Posted
技术标签:
【中文标题】mongo db:从对象数组中获取子数组,其值在单个文档的范围内【英文标题】:mongo db : get sub array from an array of objects with values within a range in a single document 【发布时间】:2021-06-09 13:14:56 【问题描述】:我有什么:
一个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
的文档中获取包含003
到012
两者的data
数组中的所有对象
我在网上搜索的结果:
我了解了mongo
和$match, $project, $filter
等中的聚合函数。我是mongo
的新手,无法理解聚合背后的直觉。
我知道我可以通过自定义函数来实现这一点,但它会包含一个会影响性能的 for 循环。必须有更好的方法来实现它,但我无法弄清楚。
注意:我也想用
pymongo
实现同样的效果
【问题讨论】:
【参考方案1】:对不起,我不知道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"
]
【讨论】:
太完美了?,非常感谢,你能提供一些aggregate framework
的资源吗?有一些很好的例子吗?
检查这个:university.mongodb.com/courses/M121/about。我从这里学习了基础知识:university.mongodb.com/courses/M001/about 我建议在聚合之前先学习基础知识。以上是关于mongo db:从对象数组中获取子数组,其值在单个文档的范围内的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Mongo DB 中的子文档数组中删除匹配条件的子文档
在 Mongo Aggregation 中获取 ElemMatch 以查找 null 或不存在的数组对象