2015-10-27 147 views
1

我有兩個單獨的MongoDB集合searchobjects,它記錄了一些用戶操作,如使用搜索頁面,並在我的網站觀看對象頁。 coollections雙方都有用戶的cookie存儲在相同的方式:MongoDB的合併結果來自兩個集合

{ 
    "_id" : ObjectId("55ac35499db5acdb1c8b4567"), 
    ... 
    "user" : { 
     "id" : "12007", 
     "cookie" : "LffDjUQHogfrihI2z/FlzQ", 
    }, 
    "createddate" : ISODate("2015-09-20T02:39:53.780+0000") 
} 

現在我需要在這兩個集合一天一天算唯一用戶。 我知道如何在一個集合指望他們:

db.objects.aggregate([ 
    { "$group": { 
     "_id":{ 
      "$subtract": [ 
       "$createddate", 
       { "$mod": [ 
        { "$subtract": [ "$createddate", ISODate("1970-01-01T00:00:00.000+00:00") ] }, 
        1000 * 60 * 60 * 24 
       ]} 
      ] 
     }, 
     'users' : {$addToSet : '$user.cookie'}, 
     } 
    }, 
    {$project: {_id : 0, date : '$_id', users : {$size : "$users"}}}, 
]) 

因此,有我一天一獨特的餅乾天數。這個問題是,並不是所有進行搜索的人都去了對象頁面(但其中一些人去),所以我需要每天通過兩個集合獲得獨特的Cookie集。 我可以從每個集合的唯一Cookie日常陣列和合並,指望他們對應用的一面,但我敢肯定,它可以在數據庫端完成。請幫忙。

+2

的MongoDB不支持以任何方式「連接」。如果您需要這些信息在兩個來源中是獨一無二的,那麼您需要首先將其合併爲一個集合。真的,您的應用程序設計應該意識到這一點,並首先將所需的所有數據寫入單個集合。其他任何事情都只是解決方法和頭痛。修復設計。 BTW。只需使用'Date(0)',因爲您不需要整個'ISODate'事情。這只是一個幫手。 –

+0

@BlakesSeven,感謝您的評論。是的,我知道有單一的收集這種需求是最好的,但現在我不能改變數據庫架構,並不得不使用兩個集合的報告。也許某種MapReduce可以提供幫助?還要感謝'Date(0)',它看起來好多了。 – aokozlov

+1

事實依然存在,「這裏沒有加入」。至於mapReduce,有一個常見的誤解,認爲它執行連接的地方沒有。只有一種特殊情況在另一個集合,結果在那裏你可以「合併」或「減少」到輸出,但它並不適合每個人,和一個特殊的情況下,主要還是寫出來給另一收集你得到結果之前, 。你的問題基本上不清楚你輸入和最終輸出的格式。 –

回答

1

唯一的辦法是做獨立的MongoDB的查詢,併合並他們的應用水平。