返回所有字段的 MongoDB 聚合。

4
我在这里尝试搜索,但并没有找到我需要的东西。我有这样的文件:
{
    appletype:Granny,
    color:Green,
    datePicked:2015-01-26,
    dateRipe:2015-01-24,
    numPicked:3
},

{
    appletype:Granny,
    color:Green,
    datePicked:2015-01-01,
    dateRipe:2014-12-28,
    numPicked:6
}

我想要只返回最近采摘的苹果,且需要所有字段。基本上,我希望我的查询仅返回第一个文档。当我尝试进行以下操作时:
db.collection.aggregate([
    { $match : { "appletype" : "Granny" } },
    { $sort : { "datePicked" : 1 } },
    { $group : { "_id" : { "appletype" : "$appletype" },
        "datePicked" : { $max : "$datePicked" } },
])

它确实返回了我最近采摘的所有Granny类型苹果,但只有datePicked为2015-01-26。我需要剩余的字段。我尝试使用$project并添加所有字段,但它没有得到我所需的结果。此外,当我将其他字段添加到组中时,由于datePicked是唯一的,它返回了两条记录。
我该如何返回所有字段,仅限于最新的datePicked?
谢谢!

你说“我希望我的查询只返回第一个文档”。所以,你想要获取最新的datePicked日期的一个文档吗? - stalk
我正在使用的集合有数千条记录。我想获取最新datePicked上选取的所有appleTypes,返回组成“apple”文档的所有字段。因此,如果在2014-01-26(或任何最新日期)选取了n个苹果,则返回这些n条记录。 - Vince
1个回答

1
根据您的描述,似乎您希望针对您收集的每种苹果类型生成一个文档,并显示具有最新“datePicked”值的文档。以下是相关的聚合查询:
db.collection.aggregate([
  { $sort: { "datePicked": -1 },
  { $group: { _id: "$appletype", color: { $first: "$color" }, datePicked: { $first: "$datePicked" }, dateRipe: { $first: "$dateRipe" }, numPicked: { $first: "$numPicked" } } },
  { $project: { _id: 0, color: 1, datePicked: 1, dateRipe: 1, numPicked: 1, appletype: "$_id" } }
])

但是根据您编写的聚合查询,看起来您想要得到这个:

db.collection.find({appletype: "Granny"}).sort({datePicked: -1}).limit(1);

1
如何将项目中的所有内容返回? - Qui-Gon Jinn
@Qui-GonJinn 自从我上次使用MongoDB以来已经有一段时间了。我认为有一种方法可以让$project显示文档中的所有内容,但是如果$project在像$group这样的步骤之后出现,它只能获取从该先前步骤返回的内容。 这是要理解关于聚合查询的一个关键点 - 查询中的每个步骤仅获取从上一个步骤返回的数据,它不会回到集合并提取原始文档。 - NoOutlet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接