MongoDB中

MongoDB中

问题描述:

荏苒两个集合

不是一个问题,关于加入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://*.com/questions/31164156/zip-arrays-with-mongodb)。 – styvane

+1

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

+0

@notionquest不一定,我不关心哪个用户得到哪个代码,只要他们得到一个唯一的代码。 – pmb

我会这样做,从集合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" 
} 

与MongoDB中的关系数据库不同,您在应用程序级别执行JOIN操作(因此可以轻松地对数据库进行水平缩放)。您需要在应用程序级别执行此操作。

+0

不太确定你的意思...我不想加入。我其实不想在应用中这样做,这只是一次性的事情。 – pmb

+0

我的意思是应用程序级别是你没有简单的MongoDB API来做到这一点。你需要自己做,所以你会查询每个集合,将数据存储在数组中,并在你的应用/脚本中做你想做的。 –