【问题标题】:make mongoDB replace single value array with string使mongoDB用字符串替换单值数组
【发布时间】:2015-10-31 23:12:51
【问题描述】:

我对 mongoDB 很陌生,正在尝试将对象插入数据库。 (哇,比 mySQL 有趣多了……)。我正在使用 strongloop 的环回框架及其 mongoDB 连接器。

该对象是我收到的一个 xml2js 解析的 xml 消息,在解析并插入到 mongo 之后,它看起来像这样:

{
    "_id": ObjectID("55c61ee9391da88435c5753f"),
    "offerChange": [
        {
            "foo": [
                "bar"
            ],
            "baz": [
                "foo"
            ]
        }
    ] 
}

如您所见,所有键的值都是数组,尽管它们都只包含一个值。显然,我可以在插入之前或在 xml 解析期间将它们转换为字符串,但这需要循环遍历所有对象的键或首先为工作人员做更多工作,这是我想避免的。实物比上面显示的要大得多。

有没有办法告诉 mongoDB 在创建文档之前或之后自动将只有一个值的数组转换为字符串?

【问题讨论】:

  • 这不是一个明智的主意。就“对象一致性”而言,最好将它们保留为数组,即使它们只包含一个条目。为什么?考虑在代码中定义一个对象。你给这个领域什么“类型”。 “数组还是字符串?”。现在对有效性检查没有多大意义吗?虽然 MongoDB 文档是无模式的,并且没有什么可以阻止您更改文档之间的结构,但您不应该这样做(以一种明确的“继承模式”之外的方式)。因此,“建议”真正保持这种状态。
  • 也就是说,如果您的 only 问题是 XML 翻译器处理您 only 想要作为单一值的事物的相当“古怪”的方式,然后通过您当前使用的特定代码在您的问题中明确说明这一点,我或其他人会建议对此进行“修复”,以便您每次都获得一个奇异值。
  • @BlakesSeven 不,实际上我认为您的第一条评论非常合理,我想我会保留它。
  • 我在这里提出的主要观点是假设它只是 { "foo": "bar" } 而不是数组。那么,如果除了“bar”之外,还想将“baz”分配给“foo”属性,会发生什么?这会破坏逻辑和简单的更新。但是有了{ "foo": ["bar"] },更新是对已经存在的数组的简单$push 操作。哪个产生{ "foo": ["bar","baz"] }。这就是我希望你考虑的,我希望你也有。
  • +1 布莱克七号的回答。如果您确实需要将值作为字符串,请在需要时将其转换以保持您的 CRUD 操作一致。

标签: javascript node.js mongodb loopbackjs


【解决方案1】:

您无需在应用程序/数据库中循环并从数组转换为字符串。 xml2js 提供了一种简洁的方式,如果只有一个项目,则返回字符串,如果有更多项目,则返回数组。

explicitArray (default: true): 总是把子节点放在一个数组中,如果 真的;否则,只有当有多个数组时才会创建一个数组。

按如下方式启动您的解析器

parseString(xml, {explicitArray: false}, function (err, result) {
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 2013-11-08
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多