【问题标题】:how to handle document from mongoDB with _bsontype properties如何使用 _bsontype 属性处理来自 mongoDB 的文档
【发布时间】:2014-07-24 08:21:48
【问题描述】:

您好,我正在浏览一个 JSON 数组,该数组是在 mongoDB 中查询文档的结果。 事实是我得到了以下行为,但我不知道为什么会这样:

in key: _bsontype |value: ObjectID
in key: id |value: S÷¯çò9þ w
in key: _bsontype |value: ObjectID
in key: id |value: S÷¯çò9þ h
in key: _bsontype |value: ObjectID
in key: id |value: S÷¯çò9þ h
in key: name |value: Default Process
in key: processType |value: Public
in key: id |value: BPMNDiagram_1
in key: name |value: procurement subprocess

如您所见,这是磨损...这是我的代码:

function changeIDs(json, map, count){
  for(var key in json){
    if(json.hasOwnProperty(key))
    if(typeof json[key] === 'object')
      changeIDs(json[key], map, count);
    else{
        console.log("in key: "+key + " |value: "+json[key]);
    }

  }
}

这是我输入的一部分(json 参数):

[
    {
        "_id": "538df78eafe7f28d39fe2077",
        "processId": "538df71bafe7f28d39fe2068",
        "processMeta": {
            "id": "538df71bafe7f28d39fe2068",
            "name": "Default Process",
            "processType": "Public"
        },
        "diagram": {
            "id": "BPMNDiagram_1",
            "name": "procurement subprocess"
        },
        "plane": {
            "id": "BPMNPlane_1",
            "bpmnElement": "538df71bafe7f28d39fe2068"
        }
    },
{other objects..},{other objects..}
]

是的,processId 和 _id 是使用 ObjectId 函数生成的,并且似乎在这里出现问题,我对此不确定,但我的猜测是每个 _bsontype 对应于 mongoSB Object Id,这是一个对象所以我的函数递归地进入这个..得到以下S÷¯çò9þ w..,对吗?

如果我无法在我的 for 中获取“processId”和“_id”键,我想也是我的 _bsontype... 所以最后,我的问题是,我怎样才能在没有得到结果的情况下遍历我的对象?,你必须看到有一个“id”属性包含废话数据,我不希望它在我的结果中寻找例如,所有键 id,但仍然能够获取我的属性“processId”或“_id”的 ObjectId.str 值。

提前致谢。

【问题讨论】:

    标签: javascript json node.js mongodb


    【解决方案1】:

    以防万一,如果将来像我这样倒霉的人也遇到同样的问题。

    你可以看到我的函数 changeIDs 有 3 个参数,我只是更改了 json 参数,它应该是一个 json(它是)你可以在我的问题中看到我的 json 输出作为文本,所以它是有效的json,但是我做了一个字符串化字符串的解析..然后我再试一次..它正在工作。

    那么解决方案呢? newJson = JSON.parse(JSON.stringify(json));

    为什么?好吧,我更好的选择是,通过这种方式,当我们对一个对象进行字符串化时,它的对象会以下列方式发生变化:

    • 未定义的值在结果中消失。
    • 丢失原型属性
    • 函数消失

    例如,如果 json 有一个对象 DATE,则该对象将被字符串化为 Date.toString(),因此它将存储字符串表示形式。并且如果函数没有 to 字符串将是未定义的。

    最后这就是为什么在执行 stringify 之后它正在工作,我的函数 ObjectId() 没有在我的 stringify 中存活,但它转换为它包含的字符串值,即 Mongo 对象 id 值......

    【讨论】:

    • 我在文档上使用了 lodash 的 _cloneDeep() 方法并遇到了与您相同的问题,但由于您的帖子,我很快就能发现问题。所以谢谢你!
    • 不幸的是,调用 JSON.stringify(doc) 不能正确转换 BSON 时间戳。我做了以下可怕的黑客攻击:if(doc.ts.high_) { doc.ts = doc.ts.high_; }
    • 您正在为应用程序使用 BSON 时间戳?你应该使用 mongo 的 date 对象或 isodate,也许 JSON.stringify 那样做转换
    猜你喜欢
    • 1970-01-01
    • 2020-03-05
    • 2018-12-27
    • 2022-08-23
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    相关资源
    最近更新 更多