我对从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",
}
有人可以帮我吗? :-)
答案 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"}
}}
])