2016-11-21 96 views
0
荏苒兩個集合

不是一個問題,關於加入MongoDB中MongoDB中

我在MongoDB的兩個集合,其中沒有一個共同的領域和我想一個zip函數適用於(如在Python中,Haskell)。這兩個集合都具有相同數量的文檔。

例如: 讓我們假設一個集合(Users)用於用戶,而另一個集合(Codes)是唯一隨機生成的代碼。

集用戶:

{ "_id" : ObjectId(""), "userId" : "123"} 
    { "_id" : ObjectId(""), "userId" : "456"} 

收集代碼:

{ "_id" : ObjectId(""), "code" : "randomCode1"} 
    { "_id" : ObjectId(""), "code" : "randomCode2"} 

所需的輸出將用戶分配到一個獨特的碼。具體如下:

輸出

{ "_id" : ObjectId(""), "code" : "randomCode1", "userId" : "123"} 
    { "_id" : ObjectId(""), "code" : "randomCode2", "userId" : "456"} 

是否存在與聚合管道這樣的方法嗎?

或者也許與地圖縮小?不要這麼想,因爲它只適用於一個集合。

我已經考慮在每個文檔對的兩個集合中插入另一個隨機id,然後使用$ lookup和這個新的id,但是這看起來像是一種矯枉過正。也可以選擇導出和使用Python,因爲沒有太多文檔,但我覺得應該有更好的方法。

+0

需要兩個不同的查詢。但是你可以使用'$ zip'操作符['在MongoDB中壓縮數組](http://stackoverflow.com/questions/31164156/zip-arrays-with-mongodb)。 – styvane

+1

您是否期望將集合1中的文檔1定位到集合2中的文檔1? – notionquest

+0

@notionquest不一定,我不關心哪個用戶得到哪個代碼,只要他們得到一個唯一的代碼。 – pmb

回答

1

我會這樣做,從集合1 & 2中獲取記錄,並將必需的字段合併到單個對象中。

您已經確認集合1和2中的記錄數是相同的。

下面的代碼將遍歷遊標並將必需的字段映射到一個對象中。最後,您可以將對象打印到控制檯或插入到另一個新集合中(插入註釋)。

var usersCursor = db.users.find({ }); 
var codesCursor = db.codes.find({ }); 
while (usersCursor.hasNext() && codesCursor.hasNext()) { 
    var user = usersCursor.next(); 
    var code = codesCursor.next(); 
    var outputObj = {}; 
    outputObj ["_id"] = new ObjectId(); 
    outputObj ["userId"] = user["userId"]; 
    outputObj ["code"] = code["code"]; 
    printjson(outputObj); 
    //db.collectionName.insertOne(outputObj); 
} 

輸出: -

{ 
    "_id" : ObjectId("58348512ba41f1f22e600c74"), 
    "userId" : "123", 
    "code" : "randomCode1" 
} 
{ 
    "_id" : ObjectId("58348512ba41f1f22e600c75"), 
    "userId" : "456", 
    "code" : "randomCode2" 
} 
1

與MongoDB中的關係數據庫不同,您在應用程序級別執行JOIN操作(因此可以輕鬆地對數據庫進行水平縮放)。您需要在應用程序級別執行此操作。

+0

不太確定你的意思...我不想加入。我其實不想在應用中這樣做,這只是一次性的事情。 – pmb

+0

我的意思是應用程序級別是你沒有簡單的MongoDB API來做到這一點。你需要自己做,所以你會查詢每個集合,將數據存儲在數組中,並在你的應用/腳本中做你想做的。 –