从MongoDB中的所有对象中获取一些值

时间:2018-07-13 08:09:48

标签: mongodb

我对从mongo数据库中获取特定数据有疑问。数据库中的数据非常大,并且其中有许多对象。这些对象具有以下架构:

{
        "_id": ObjectId("XXXX"),
        "app_id": "XXXXXX",
        "title": "The title",
        "os": "OS",
        "crash": [{
                "crash_reason": {
                        "updated_at": "2018-06-28T03:39:47Z",
                        ...many values ...
                },
                "crashes": [{
                        ...many values ...
                },
                {
                        ...many values ...
                }],
                "status": "success",
        }, {
                "crash_reason": {
                        "updated_at": "2018-06-28T03:39:46Z",
                        ...many values ...
                },
                "crashes": [{
                        ...many values ...
                },
                {
                        ...many values ...
                }],
                "status": "success",
        }],
        "status": "success",
}

所以...要获取所有对象,我只是使用我的数据库,然后执行此操作:

db.crashes.find()

但是,我想获取所有对象,但仅包含特定数据。输出应如下所示(如果可能)。

{
        "_id": ObjectId("XXXX"),
        "app_id": "XXXXXX",
        "title": "the title",
        "os": "OS",
        "crash": [{
            "crash_reason": {
                    "updated_at": "2018-06-28T03:39:47Z" }
                 }]
}

可悲的是,我是mongo的新手,并尝试通过文档找到解决方案,但没有成功。我尝试了很多事情,例如:

db.crashes.find([{$group:{app_id: "$app_id",title: "$title",os: "$os", crash: { $first: "$updated_at" }}}])
db.crashes.aggregate([{$group:{app_id: "$app_id",title: "$title",os: "$os", crash: { $first: "$updated_at" }}}])

有可能吗?我也会对以下输出感到满意:-D

{
        "_id": ObjectId("XXXX"),
        "app_id": "XXXXXX",
        "title": "the title",
        "os": "OS",
}

有人可以帮我吗? :-)

2 个答案:

答案 0 :(得分:0)

您需要项目您的数据(https://docs.mongodb.com/manual/reference/operator/projection/positional/

尝试一下:

db.crashes.find({}, {"app_id": 1, "title": 1, "os": 1})

如果要获取具有最新updatedAt值的数组元素,则可以使用以下管道:

db.crashes.aggregate([
  {$unwind: '$crash'},
  {$sort: {'crash.crash_reason.updatedAt': -1}},
  {$group: {
     _id: "$app_id",
     title: {$first: "$title"},
     os: {$first: "$os"},
     crash: {$first: "$crash"}
  }}
])

这将$unwind个崩溃数组(即,它将为每个崩溃数组元素创建一个文档),然后它将在updatedAt日期(最新的日期)之前对所有文档进行排序。最后,它将按app_id对所有文档进行分组,并采用第一个crash值,这将是上一个$sort阶段的最后一个值。

如果您想进一步削减数据,可以在$project阶段之前或之后在聚合管道中添加一个$group阶段(例如,您可以在第一个阶段中切除所有不相关的数据)阶段以获得更好的性能。

请参阅文档以获得更好的解释(https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/

答案 1 :(得分:0)

尝试下面的aggregate查询以返回带有预期字段的最新子文档数据,

db.crashes.aggregate([
  {$unwind: '$crash'},
  {$sort: {'crash.crash_reason.updatedAt': -1}},
  {$group: {
     _id: "$_id",
     app_id:{$first:"$app_id"},
     title: {$first:"$title"},
     os: {$first:"$os"},
     crash: {$first: "$crash.crash_reason"}
  }}
])