【问题标题】:Zipping two collections in mongoDB在 mongoDB 中压缩两个集合
【发布时间】:2016-11-23 01:52:49
【问题描述】:

不是关于 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"}

有没有办法用聚合管道做到这一点?

或者也许使用 map reduce?不要这么认为,因为它只适用于一个集合。

我考虑过在每个文档对的两个集合中插入另一个随机 id,然后将 $lookup 与这个新 id 一起使用,但这似乎有点矫枉过正。另外一种选择是导出和使用 Python,因为没有那么多文档,但我觉得应该有更好的方法。

【问题讨论】:

  • 您需要两个不同的查询。但是您可以使用$zip 运算符zip array in MongoDB
  • 您是否希望在位置上将集合 1 中的文档 1 映射到集合 2 中的文档 1?
  • @notionquest 不一定,我不在乎哪个用户得到哪个代码,只要他们得到一个唯一的代码。

标签: mongodb


【解决方案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"
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 不太清楚你的意思...我不想加入。我实际上不想在应用程序中这样做,这只是一次性的事情。
    • 我所说的应用程序级别的意思是您没有简单的 MongoDB API 来执行此操作。您需要自己执行此操作,以便查询每个集合、将数据存储在数组中并在您的应用程序/脚本中执行您想要的操作。
    猜你喜欢
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 2012-09-15
    • 2017-07-13
    • 2017-11-10
    • 2020-01-31
    • 1970-01-01
    • 2020-05-12
    相关资源
    最近更新 更多