2017-03-01 61 views
0

我這裏有兩個集合:Mongo聚合管道:如何在後續階段訪問一個組階段變量?

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

VisitorLogs單元收集在指到第二集中,即VisitorLog。

我需要爲每個目的找到具有最大訪問次數的單位。

想這蒙戈外殼

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了其有最大的訪問單元號目的「業務」

我現在想要得到號碼的「業務ss「訪問05in12in2了。 我認爲它在第一階段的「count」變量中。

我該如何訪問?我在第二階段最後試{$group:{_id:"$_id.purpose", unit:{$first:"$_id.number"}, visits:"$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 
[email protected]/mongo/shell/utils.js:25:13 
[email protected]/mongo/shell/assert.js:13:14 
[email protected]/mongo/shell/assert.js:287:5 
[email protected]/mongo/shell/collection.js:1312:5 
@(shell):1:1 

有人可以幫我嗎?

+0

我不知道的邏輯,但您有權訪問計數變量用表達式來使用變量。例如'{$ group:{_ id:「$ _ id.purpose」,單位:{$ first:「$ _ id.number」},訪問次數:{$ first:「$ count」}}}' {$ group:{_ id:「$ _ id.purpose」,單位:{$ first:「$ _ id.number」},訪問次數:{$ sum:「$ count」}}}' – Veeram

回答

0

下輸出我需要什麼:

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

您有這方面的信息,但您正在通過$group階段將其切斷。只要改變階段以下(請注意最後一個參數):

{ $group : { 
    _id : "$_id.purpose", 
    unit : { $first : "$_id.number" }, 
    visits : { $first : "$count" } 
}}