【问题标题】:mongoDB debugging with printjson in mongo shell在 mongo shell 中使用 printjson 调试 mongoDB
【发布时间】:2017-06-12 20:33:05
【问题描述】:

我正在尝试在临时编码步骤中使用 printjson 调试 mongoDB 查询。作为中间步骤,我能够从具有不同结构的三个集合中获得类似的printjson 输出。我认为这允许我从现在开始对所有三个不同的集合使用通用代码。但是,这似乎不起作用。两个集合的行为与预期相同,但第三个在随后的编码步骤中没有(使用Object.keys 函数)。我有三个问题:

  1. printjson 是不是很好的调试工具?
  2. 为什么具有相似printjson 输出的代码作为中间步骤在后续编码步骤中表现不同?
  3. 如何更正layouts3 中的查询代码以产生与layouts1layouts2 产生的结果相似的结果?

三个不同的集合是:layouts1layouts2layouts3

db.layouts1.insert({
    "_id": ObjectId("58e574a768afb6085ec3a388"),
    "positions": [{
            "_id":      ObjectId("58e55f0f68afb6085ec3a2cc"),
            "cyan" :    [{"unit": "08","side": "5","position": "Far","_id": ObjectId("58e55f0f68afb6085ec3a2d0")}],
            "magenta":  [{"unit": "08","side": "5","position": "Far","_id": ObjectId("58e55f0f68afb6085ec3a2cd")}],
            "yellow":   [{"unit": "08","side": "3","_id": ObjectId("58e55f0f68afb6085ec3a2ce")}],
            "black":    [{"unit": "08","side": "5","position": "Far","_id": ObjectId("58e55f0f68afb6085ec3a2cf")}]
        }]
});

db.layouts2.insert({
    "_id" : ObjectId("58e574a768afb6085ec3a388"),
    "pages" : [{
            "_id"       : ObjectId("58e542fb68afb6085ec3a1d2"),
            "positions" : [ 
                        {"cyan":     [{ "unit" : "08", "side" : "5","position" : "Far","_id" : ObjectId("58e542fb68afb6085ec3a1d6")}]}, 
                        {"magenta":  [{"unit" : "08","side" : "5","position" : "Drive Side Far","_id" : ObjectId("58e542fb68afb6085ec3a1d3")}]},
                        {"yellow":   [{"unit" : "08","side" : "3","position" : "Far","_id" : ObjectId("58e542fb68afb6085ec3a1d4")}]},
                        {"black":    [{"unit" : "08","side" : "5","position" : "Far","_id" : ObjectId("58e542fb68afb6085ec3a1d5")}]}
                            ]
                        }]
            });

db.layouts3.insert({
    "_id":              ObjectId("58e574a768afb6085ec3a388"),
    "pages": [{
        "_id":          ObjectId("58e542fb68afb6085ec3a1d2"),
        "positions":    [{ "_id": ObjectId("58e55f0f68afb6085ec3a2cc"),
            "cyan":     [{ "unit": "08", "side": "5", "position": "Far", "_id": ObjectId("58e55f0f68afb6085ec3a2d0") }],
            "magenta":  [{ "unit": "08", "side": "5", "position": "Far", "_id": ObjectId("58e55f0f68afb6085ec3a2cd") }],
            "yellow":   [{ "unit": "08", "side": "3", "_id": ObjectId("58e55f0f68afb6085ec3a2ce") }],
            "black":    [{ "unit": "08", "side": "5", "position": "Far", "_id": ObjectId("58e55f0f68afb6085ec3a2cf") }]
        }]}]});

下面是获得输出所需的代码,该输出似乎具有相似的数据结构,通过查看printjson 输出来判断三个集合中的每一个。

db.layouts1.find().forEach(doc => { doc.positions = doc.positions
    .map(position => { Object.keys(position) // Returns a new array conaining all keys for positions
        .filter(positionKey => positionKey !== "_id") // Returns a new array without _id
        .forEach(positionKey => { printjson(position[positionKey])})})})

db.layouts2.find().forEach(doc => { doc.pages = doc.pages
.map( page => { page.positions
    .forEach( position => { Object.keys(position)
        .forEach( positionKey => {printjson(position[positionKey])})})})})


db.layouts3.find().forEach(doc => { doc.pages = doc.pages
    .map(page => { page.positions // page.positions mapped and is []
        .forEach(position => { Object.keys(position) // returns one array with _id, cyan, magenta, etc.
            .forEach(positionKey => { printjson(position[positionKey])})})})})

以下代码适用于layouts1layouts2,但不适用于layouts3

db.layouts1.find().forEach(doc => { doc.positions = doc.positions
    .map(position => { Object.keys(position) // Returns a new array conaining all keys for positions
        .filter(positionKey => positionKey !== "_id") // Returns a new array without _id
        .forEach(positionKey => { position[positionKey]
            .forEach(colorDetails => { printjson(Object.keys(colorDetails))
            })})})})

db.layouts2.find().forEach(doc => { doc.pages = doc.pages
.map( page => { page.positions
    .forEach( position => { Object.keys(position)
        .forEach( positionKey => {position[positionKey]
        .forEach( colorDetails => { printjson(Object.keys(colorDetails))}) }) })})})

以下方法不起作用。它会产生以下错误:TypeError: position[positionKey].forEach is not a function

db.layouts3.find().forEach(doc => { doc.pages = doc.pages
    .map(page => { page.positions // page.positions mapped and is []
        .forEach(position => {Object.keys(position)
            .forEach(positionKey => { position[positionKey]
                .forEach( colorDetails => { printjson(Object.keys(colorDetails))
                })})})})})

【问题讨论】:

    标签: javascript arrays mongodb


    【解决方案1】:
    1. printjson 似乎是一个很好的调试工具,它帮助我发现了问题
    2. 实际上代码有轻微的,很难注意到,printjson 输出。该代码不起作用,在输出顶部有ObjectId("58e55f0f68afb6085ec3a2cc")
    3. 产生与 layouts1 和 layouts2 类似的结果所需的代码如下:

      db.layouts3.find().forEach(doc => { doc.pages = doc.pages .map(page => { page.positions // page.positions mapped and is [] .forEach(position => {Object.keys(position) // Filter the "_id" field which is needed to remove the "_id" field .filter(positionKey => positionKey !== "_id") .forEach(positionKey => { position[positionKey] .forEach( colorDetails => { printjson(Object.keys(colorDetails)) })})})})})

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 2020-01-07
      相关资源
      最近更新 更多