首页 > 解决方案 > MongoDB - 查询嵌入式文档数组

问题描述

我最近开始使用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
}

我目前正在将整个 JSON 对象保存在数据库中。

服务器还应该处理用户的 http 请求,它会在数据库中查询请求的数据。用户请求总是针对 data数组的一个元素和时间戳。因此,服务器响应应如下所示:

{ id: "data_1", value : 10, timestamp : 12234456}

我尝试将db.collection.find$elemMatch一起使用,但我的输出仍然包含data数组和所需的元素。

{
    data: 
    [{
        id: "data_1",
        value: 10
    }],
   timestamp : 12234456
}

所以我的问题是是否有可能查询数据库并仅返回结合时间戳的“数据”数组的所需元素,或者我需要在读取数据库后重新创建响应 JSON 对象。

亲切的问候。

标签: databasemongodb

解决方案


欢迎来到 mongo 世界。您可以通过聚合轻松实现这一点

  • $uwnind解构数组
  • $match得到期望值
  • $addFields向对象添加新字段
  • $replaceRoot使对象成为根

这是代码

db.collection.aggregate([
  { "$unwind": "$data" },
  { "$match": { "data.id": "data_1" } },
  { "$addFields": { "data.timestamp": "$timestamp" } },
  { "$replaceRoot": { "newRoot": "$data" } }
])

工作蒙戈游乐场


推荐阅读