Database MongoDB-查询嵌入文档数组

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

我最近开始使用MongoDB保存项目中的数据,其基本思想如下

在服务器端,我在WebSocket上接收一些JSON对象,并将其存储在数据库中

我收到的数据如下所示:

{ 
    {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
    将输入文档替换为
    数据
    字段
希望这对任何需要这样做的人都有用,如果您对我当前的设置有任何建议/改进,请告知我,因为我是MongoDB的新手


运行示例

感谢@varman的快速回复,我只使用过MySQL,现在我进入了mongo世界,到目前为止,这很有趣,我有一个后续问题。与“查找”相比,您是否知道执行下面的“聚合”函数的总处理时间,比如说我有10万个条目或1.000.000(我期望随着时间的推移得到什么)这会花费很多时间来处理它吗?(指30秒到100万秒)我想问的是,我是否应该改变任何东西。当你处理大量数据时,很少有聚合阶段是昂贵的,比如
展开
查找
。我希望你正在寻找
解释()
在聚合框架中,它提供了一些有用的信息。请仔细阅读。但是当您优化管道时,性能会非常快。如果您有任何聚合问题,请点击我,我会尽力解决。聚合非常有趣…开始奋斗…但您可以轻松赶上。我也在MySQL中
  { $addFields: {"data.timestamp": "$timestamp"} }
  {
    $unwind: "$data"
  }
{"$replaceRoot": {"newRoot": "$data"}}