在mongoDB中压缩两个集合

时间:2016-11-21 18:14:53

标签: 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,因为没有那么多文档,但我觉得应该有更好的方法。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我会做这样的事情来获取第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"
}
相关问题