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

仅从MongoDB中的所有对象中获取一些值,mongodb,Mongodb,我有一个关于从mongo db中获取特定数据的问题。数据库中的数据非常大,其中有许多对象。这些对象具有以下体系结构: { "_id": ObjectId("XXXX"), "app_id": "XXXXXX", "title": "The title", "os": "OS", "crash": [{ "crash_reason": {

我有一个关于从mongo db中获取特定数据的问题。数据库中的数据非常大,其中有许多对象。这些对象具有以下体系结构:

{
        "_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()
但是,我想获取所有对象,但只获取特定数据。输出应该是这样的(如果可能的话)

遗憾的是,我是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",
}

有人能帮我吗?:-)

您需要投影您的数据()

试试这个:

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\u id
对所有文档进行分组,并获取第一个
crash
值,这将是上一个
$sort
阶段的最后一个值

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


查看文档以获得更好的解释()

尝试下面的
aggregate
query返回最新的子文档数据和预期字段

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"}
  }}
])

魔兽世界的复制品很简单,而且很有效。链接到文档的thx。还有没有办法获得第一个“更新的地址”或这是不可能的?是的,谢谢。但我得到了一个“字段'title'必须是累加器对象”异常。我正在试图找出原因。对不起,您可以在
标题
操作系统
上使用
$first
操作符,我会更新答案。您好,非常感谢。它现在看起来与Amrut的解决方案几乎相同。遗憾的是,我得到了相同的异常:zsh:bad math expression:在{:}处需要操作数zsh:bad math expression:在{:{crash…'我正在尝试了解发生了什么,并希望能够修复它。我认为这不是查询的问题。如何连接到db?在Robo3T中运行它对我来说很好。嗨,也感谢你的帮助。但是我遇到了异常:zsh:糟糕的数学表达式:操作数应在
{:}'zsh:错误的数学表达式:在
{:{crash….'处应为操作数。我也在尝试查找问题。抱歉,我犯了一个错误。现在它正在工作。许多THX需要帮助:-)
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"}
  }}
])