3

我有以下问题:

此查询返回 1 个结果,这是我想要的:

> db.items.aggregate([ {$group: { "_id": "$id", version: { $max: "$version" } } }])

{
"result" : [
    {
        "_id" : "b91e51e9-6317-4030-a9a6-e7f71d0f2161",
        "version" : 1.2000000000000002
    }
],
"ok" : 1
}

这个查询(我刚刚添加了投影,以便以后可以查询整个文档)返回多个结果。我究竟做错了什么?

> db.items.aggregate([ {$group: { "_id": "$id", version: { $max: "$version" } }, $project: { _id : 1 } }])

  {
"result" : [
    {
        "_id" : ObjectId("5139310a3899d457ee000003")
    },
    {
        "_id" : ObjectId("513931053899d457ee000002")
    },
    {
        "_id" : ObjectId("513930fd3899d457ee000001")
    }
],
"ok" : 1
}
4

3 回答 3

1

找到了答案

1.首先我需要得到所有的_id

db.items.aggregate( [ 
  { '$match': { 'owner.id': '9e748c81-0f71-4eda-a710-576314ef3fa' } },
  { '$group': { _id: '$item.id', dbid: { $max: "$_id" } } } 
]);

2.然后我需要查询文件

db.items.find({ _id: { '$in': "IDs returned from aggregate" } });

看起来像这样:

db.items.find({ _id: { '$in': [ '1', '2', '3' ] } });
于 2013-03-08T07:18:33.123 回答
0

我知道它迟到了,但仍然回答它,这样其他人就不必去其他地方寻找正确的答案了

请参阅Deka 的答案,这将完成您的工作。

于 2016-07-13T08:48:40.183 回答
0

并非所有蓄能器都在$project阶段可用。我们需要考虑在项目中我们可以在累加器方面做什么以及我们可以在小组中做什么。让我们来看看这个:


db.companies.aggregate([{
  $match: {
    funding_rounds: {
      $ne: []
    }
  }
}, {
  $unwind: "$funding_rounds"
}, {
  $sort: {
    "funding_rounds.funded_year": 1,
    "funding_rounds.funded_month": 1,
    "funding_rounds.funded_day": 1
  }
}, {
  $group: {
    _id: {
      company: "$name"
    },
    funding: {
      $push: {
        amount: "$funding_rounds.raised_amount",
        year: "$funding_rounds.funded_year"
      }
    }
  }
}, ]).pretty()

MongoDB中的$组

我们在哪里检查是否有任何funding_rounds不为空。然后它被unwind编辑到$sort后面的阶段。我们将为funding_rounds每个公司的数组的每个元素看到一个文档。所以,我们在这里要做的第一件事是$sort基于:

  1. funding_rounds.funded_year
  2. funding_rounds.funded_month
  3. funding_rounds.funded_day

在按公司名称分组的小组赛中,阵列正在使用$push. $push应该是文档的一部分,指定为我们在小组赛中命名的字段的值。我们可以推送任何有效的表达式。在这种情况下,我们将文档推送到此数组,并且对于我们推送的每个文档,它都被添加到我们正在累积的数组的末尾。在这种情况下,我们正在推动由raised_amountand构建的文档funded_year。因此,该$group阶段是一个文档流,_id其中包含我们指定公司名称的位置。

请注意,它$push$group分阶段可用的,但不是$project分阶段的。这是因为$group阶段旨在获取一系列文档并根据该文档流累积值。

$project另一方面,一次处理一个文档。因此,我们可以计算项目阶段内单个文档中数组的平均值。但是做这样的事情,一次一个,我们看到文件,对于每一个文件,它通过小组赛阶段推动一个新的价值,这$project不是舞台设计要做的事情。对于我们想要使用的那种操作$group

让我们看另一个例子:


db.companies.aggregate([{
  $match: {
    funding_rounds: {
      $exists: true,
      $ne: []
    }
  }
}, {
  $unwind: "$funding_rounds"
}, {
  $sort: {
    "funding_rounds.funded_year": 1,
    "funding_rounds.funded_month": 1,
    "funding_rounds.funded_day": 1
  }
}, {
  $group: {
    _id: {
      company: "$name"
    },
    first_round: {
      $first: "$funding_rounds"
    },
    last_round: {
      $last: "$funding_rounds"
    },
    num_rounds: {
      $sum: 1
    },
    total_raised: {
      $sum: "$funding_rounds.raised_amount"
    }
  }
}, {
  $project: {
    _id: 0,
    company: "$_id.company",
    first_round: {
      amount: "$first_round.raised_amount",
      article: "$first_round.source_url",
      year: "$first_round.funded_year"
    },
    last_round: {
      amount: "$last_round.raised_amount",
      article: "$last_round.source_url",
      year: "$last_round.funded_year"
    },
    num_rounds: 1,
    total_raised: 1,
  }
}, {
  $sort: {
    total_raised: -1
  }
}]).pretty()

MongoDB中的组与项目

$group舞台上,我们使用$first$last累加器。对,我们可以再次看到$push- 我们不能在项目阶段使用$first$last。因为同样,项目阶段并非旨在根据多个文档累积价值。相反,它们旨在一次重塑一个文档。使用算子计算总轮数$sum。值1仅计算通过该组的文档数以及匹配或分组在给定_id值下的每个文档的数量。该项目可能看起来很复杂,但它只是使输出变得漂亮。只是它包含num_roundstotal_raised来自上一个文档。

于 2016-09-23T23:08:42.647 回答