2016-07-25 141 views
1

我正在从mongodb迁移到mysql。我在一个集合中有一个子文档,我需要使用子文档来查找数据。如何从mongodb中的嵌套对象中获取密钥

收集结构看起来像这样

{ 
     "_id" : ObjectId("578506a90420bec15ea33783"), 
     "reselected" : "ABCDEFGH", 
      "reskip" : [], 
      "restatus" : "active", 
      "reuser" : { 
       "activeListings" : [ 
        { 
         "subcategory" : "mobiles", 
         "title" : " Mobile 1", 
         "transactiontype" : "post" 
        }, 
        { 
         "category" : "mobiles", 
         "title" : " Mobile 2", 
         "transactiontype" : "post" 
        } ], 
      "reuserInput" : "2", 
      "reussdsession" : "303757117" } 

我与MapReduce的代码试图

mr = db.runCommand({ 
      "mapreduce" : "collection name", 
      "map" : function() {  */map/ 
      for (var key in "this.reuser.activeListings") { 
      for (var key1 in "this.reuser.activeListings"[key]) { 
       emit(key1, null); 
      } 
      } 
      }, 
      "reduce" : function(key, stuff) { return null; }, /*reducer/ 
      "out": "my_collection" + "_keys" 
     }) 

我需要activeListings输出

{subcategory,title,transactiontype,category} 

回答

0

你基本上需要遍历数组和然后发出每个键。下面的MapReduce脚本会给你所需的密钥列表:

mr = db.runCommand({ 
    "mapreduce": "collectionName", 
    "map": function() { /* mapper */ 
     this.reuser.activeListings.forEach(function (obj){ 
      for (var key in obj) { emit(key, null); } 
     });     
    }, 
    "reduce": function() {}, /* reducer */ 
    "out": "my_collection" + "_keys" 
}) 

要获得所有动态密钥列表,在结果集合运行不同:

> db[mr.result].distinct("_id") 
["subcategory", "title", "transactiontype", "category"] 
+0

我检查了代码,但代码有“this.reuser.activeListings.forEach”,但是当我执行它时会抛出一个类型错误。我检查了分配变量但仍显示错误。 – user2733125

+0

嗨,我已经执行没有引号的代码,但它仍然显示相同的错误,“errmsg”:“TypeError:this.reuser未定义:\ n_funcs1 @:2:9 \ n”, – user2733125

+0

谢谢,代码是工作,我正在检查一些其他收集 – user2733125