当前位置: 首页 > 知识库问答 >
问题:

Mongo聚合管道:如何在后续阶段访问一个组阶段变量?

姬实
2023-03-14

我这里有两个集合:

> db.Unit.find({}).limit(1).pretty()
{
    "_id" : ObjectId("58b6878de1648d05903e1beb"),
    "number" : "07in15in4",
    "owner" : {
            "name" : "vacant"
    },
    "floor" : 15,
    "tower" : 4,
    "VisitorLogs" : [
            ObjectId("58b6878ee1648d05903e1d22"),
            ObjectId("58b6878ee1648d05903e236e"),
            ObjectId("58b6878ee1648d05903e23c9"),
            ObjectId("58b6878ee1648d05903e2454"),
            ObjectId("58b6878ee1648d05903e2915"),
            ObjectId("58b6878ee1648d05903e2aae"),
            ObjectId("58b6878ee1648d05903e2b93")
    ]

}

> db.VisitorLog.find({}).limit(1).pretty()
{ "_id" : ObjectId("58b6878fe1648d05903e2efa"), "purpose" : "WorkHere" }

“设备”集合中的访客日志是指第二个集合,即访客日志。

我需要找到每个目的访问次数最多的单位。

我在mongo shell中尝试过:

units=db.Unit
units.aggregate([
    {$match:{'VisitorLogs':{$gt:[]}}},
    {$unwind:'$VisitorLogs'},
    {$lookup:{
        from:"VisitorLog", 
        localField:"VisitorLogs", 
        foreignField:"_id", 
        as:"log"}
      },
    {$group:{_id:{number:"$number", purpose:"$log.purpose"}, count:{$sum:1}}},
    {$sort:{count:-1}},
    {$group:{_id:"$_id.purpose", unit:{$first:"$_id.number"}}},
    {$limit:10}
])  

我得到以下结果:

{ "_id" : [ "Business" ], "unit" : "05in12in2" }
{ "_id" : [ "WorkHere" ], "unit" : "09in04in2" }
{ "_id" : [ "Casual" ], "unit" : "10in05in2" }
{ "_id" : [ "JobInterview" ], "unit" : "05in14in2" }

这意味着,例如,编号为05in12in2的单位的访问量最大,其目的是“业务”

我现在想获得05in12in2的“商务”访问次数。我认为它在第一个小组阶段的“计数”变量中。

我如何访问它?我在倒数第二个阶段尝试了{$group:{_id:"$_id.purpose",单位:{$first:"$_id.number"},访问:"$count"}},,即在限制阶段之前,但我得到错误:

> units.aggregate([
... {$match:{'VisitorLogs':{$gt:[]}}},
... {$unwind:'$VisitorLogs'},
... {$lookup:{from:"VisitorLog", localField:"VisitorLogs", foreignField:"_id", as:"log"}},
... {$group:{_id:{number:"$number", purpose:"$log.purpose"}, count:{$sum:1}}},
... {$sort:{count:-1}},
... {$group:{_id:"$_id.purpose", unit:{$first:"$_id.number"}, visits:"$count"}},
... {$limit:10}
... ])
assert: command failed: {
    "ok" : 0,
    "errmsg" : "the group aggregate field 'visits' must be defined as an expression inside an object",
    "code" : 15951
} : aggregate failed
_getErrorWithCode@src/mongo/shell/utils.js:25:13
doassert@src/mongo/shell/assert.js:13:14
assert.commandWorked@src/mongo/shell/assert.js:287:5
DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1312:5
@(shell):1:1

有人能帮我吗?

共有2个答案

司马同
2023-03-14

以下输出是我需要的:

units.aggregate([
    {$match:{'VisitorLogs':{$gt:[]}}},
    {$unwind:'$VisitorLogs'},
    {$lookup:{from:"VisitorLog", localField:"VisitorLogs", foreignField:"_id", as:"log"}},
    {$group:{_id:{number:"$number", purpose:"$log.purpose"}, count:{$sum:1}}},
    {$sort:{count:-1}},
    {$group:{_id:"$_id.purpose", number:{$first:"$_id.number"}, visits:{$first:"$count"}}},
    {$limit:10}
               ]) 
璩珂
2023-03-14

您拥有此信息,但您正在$group阶段将其切断。只需将阶段更改为以下内容(请注意最后一个参数):

{ $group : {
  _id : "$_id.purpose",
  unit : { $first : "$_id.number" },
  visits : { $first : "$count" }
}}
 类似资料:
  • 问题内容: 如果工作失败,我不必等待所有人完成。是否可以中止仍在运行的并行阶段。它们必须显示为“已终止”,而不是带有红色十字图标,因为必须突出显示失败的图标。 问题答案: 将parallelsAlwaysFailFast添加到您的选项中,如果任何(并行化)阶段失败,整个管道将停止。 引用来源: 总是失败失败 将管道中所有后续并行阶段的failfast设置为true。 例如:options {par

  • 我有一系列执行快速检查的阶段。我想完成所有这些,即使有失败。例如: 第二阶段失败,因此默认情况下第三阶段不执行。 通常这将是的工作,但我想在阶段视图中显示它们。在下面的模型中: 构建4显示了通常发生的情况。作业失败,因此不运行

  • 问题内容: 我正在尝试创建一个声明性的Jenkins管道脚本,但是简单变量声明存在问题。 这是我的脚本: 但是,我收到此错误: 我正在使用Jenkins 2.7.4和Pipeline 2.4。 问题答案: Jenkins Pipelines的Declarative模型具有受限制的语法子集,该子句允许在块中使用- 有关更多信息,请参见语法指南。您可以通过将步骤包装在一个块中来绕过该限制,但是结果,您

  • 我试图创建一个声明性詹金斯管道脚本,但有简单的变量声明问题。 以下是我的剧本: 然而,我得到了这个错误: 我在詹金斯2.7.4和管道2.4上。

  • 因此,我有一个JavaFX2.0应用程序,主窗口在启动时显示。我想做的是让用户按下一个按钮,然后在主窗口旁边弹出另一个窗口。 所以,我想在主舞台左侧“固定”一个未装饰的舞台。 我知道如何制作窗口,以及如何使其不被装饰,新窗口工作正常,我只想使其在移动窗口时相对于主窗口(或舞台,无论您喜欢称之为哪个)保持相同的位置。

  • 我正在使用Netbeans 7.2和Scene Builder1.0开发一个JavaFX应用程序。我有我的主屏幕设置,我想有它,所以我点击一个按钮,它将关闭主窗口和打开另一个。主Stage对象位于main类中,但controller类是独立的,不能访问它,因为它不是静态的,并且位于不同的类中。我如何改变场景或舞台?