Database MongoDB-查询嵌入文档数组
我最近开始使用MongoDB保存项目中的数据,其基本思想如下 在服务器端,我在WebSocket上接收一些JSON对象,并将其存储在数据库中 我收到的数据如下所示:Database MongoDB-查询嵌入文档数组,database,mongodb,Database,Mongodb,我最近开始使用MongoDB保存项目中的数据,其基本思想如下 在服务器端,我在WebSocket上接收一些JSON对象,并将其存储在数据库中 我收到的数据如下所示: { {ident: "message_1"}, data: [ {id: "data_1", value : 10}, {id: "data_2", value : 20}, {id: "d
{
{ident: "message_1"},
data:
[
{id: "data_1", value : 10},
{id: "data_2", value : 20},
{id: "data_3", value : 40},
{id: "data_4", value : 60},
{id: "data_4", value : 60},
],
timestamp : 12234456
}
{ id: "data_1", value : 10, timestamp : 12234456}
我目前正在数据库中保存整个JSON对象
服务器还应该处理用户http请求,在该请求中,它向数据库查询请求的数据。用户请求总是针对数据
数组的一个元素和时间戳。因此,服务器响应应如下所示:
{
{ident: "message_1"},
data:
[
{id: "data_1", value : 10},
{id: "data_2", value : 20},
{id: "data_3", value : 40},
{id: "data_4", value : 60},
{id: "data_4", value : 60},
],
timestamp : 12234456
}
{ id: "data_1", value : 10, timestamp : 12234456}
我尝试使用with,但我的输出仍然包含数据
数组和所需元素
{
data:
[{
id: "data_1",
value: 10
}],
timestamp : 12234456
}
因此,我的问题是,是否有可能查询数据库并仅返回所需的“data”数组元素和时间戳,或者在读取数据库后,我需要重新创建响应JSON对象
亲切问候。欢迎来到mongo世界。您可以通过聚合轻松实现这一点
解构数组$uwnind
获取所需值$match
向对象添加新字段$addFields
将对象设为根$replaceRoot
db.collection.aggregate([
{ "$unwind": "$data" },
{ "$match": { "data.id": "data_1" } },
{ "$addFields": { "data.timestamp": "$timestamp" } },
{ "$replaceRoot": { "newRoot": "$data" } }
])
工作虽然@varman的答案对这个问题是正确的,但为了更好地匹配我的情况,数组
数据
将有很多元素(超过100个),因为注释“展开”中的@varman可能会非常昂贵,特别是当数组包含大量元素时。因此,理想情况下,我更愿意在数组仅包含不需要的元素时进行“展开”,以实现我将顺序更改为以下内容:
- 使用
仅获取包含所需“$match
元素的文档数据
- 使用
和$project
从数据中筛选出不需要的元素$filter
- 现在添加
字段,如正确答案所示时间戳
- 使用
解构输入文档中的展开
数组字段,以输出每个元素的文档数据
- 然后使用
将输入文档替换为$replaceRoot
字段数据
运行示例感谢@varman的快速回复,我只使用过MySQL,现在我进入了mongo世界,到目前为止,这很有趣,我有一个后续问题。与“查找”相比,您是否知道执行下面的“聚合”函数的总处理时间,比如说我有10万个条目或1.000.000(我期望随着时间的推移得到什么)这会花费很多时间来处理它吗?(指30秒到100万秒)我想问的是,我是否应该改变任何东西。当你处理大量数据时,很少有聚合阶段是昂贵的,比如
展开
,查找
。我希望你正在寻找解释()
在聚合框架中,它提供了一些有用的信息。请仔细阅读。但是当您优化管道时,性能会非常快。如果您有任何聚合问题,请点击我,我会尽力解决。聚合非常有趣…开始奋斗…但您可以轻松赶上。我也在MySQL中
{ $addFields: {"data.timestamp": "$timestamp"} }
{
$unwind: "$data"
}
{"$replaceRoot": {"newRoot": "$data"}}