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,因为没有太多文档,但我觉得应该有更好的方法。
我会这样做,从集合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操作(因此可以轻松地对数据库进行水平缩放)。您需要在应用程序级别执行此操作。
不太确定你的意思...我不想加入。我其实不想在应用中这样做,这只是一次性的事情。 – pmb
我的意思是应用程序级别是你没有简单的MongoDB API来做到这一点。你需要自己做,所以你会查询每个集合,将数据存储在数组中,并在你的应用/脚本中做你想做的。 –
需要两个不同的查询。但是你可以使用'$ zip'操作符['在MongoDB中压缩数组](http://*.com/questions/31164156/zip-arrays-with-mongodb)。 – styvane
您是否期望将集合1中的文档1定位到集合2中的文档1? – notionquest
@notionquest不一定,我不关心哪个用户得到哪个代码,只要他们得到一个唯一的代码。 – pmb