不是关于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 :(得分: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"
}