【问题标题】:Change datastructure of collection in MongoDB with NodeJS使用 NodeJS 更改 MongoDB 中集合的数据结构
【发布时间】:2019-08-21 12:51:54
【问题描述】:

我正在使用 NodeJS 和 MongoDB,

实际上我对我在 MongoDB 中使用的数据结构有疑问,目前我将数据保存在数据库中,如下所示:

{
    "_id" : ObjectId("4f9519d6684c8b1c9e72e367"),
    "tipo" : "First Post on MongoDB",
    "rates": {
            "user": "5c981a0f8a76d426dc04619e",
            "votation": 1
    },
}

但我想存储数据的方式是这样的结构:

{
    "_id" : ObjectId("4f9519d6684c8b1c9e72e367"),
    "tipo" : "First Post on MongoDB",
    "rates": {
            "5c981a0f8a76d426dc04619e":{
                "votation": 1
           }
    },
}

我一直在尝试像上一个示例一样保存数据,但我没有实现,

这是我在 NodeJS 中使用 const 的方式。

  const post = {
    tipo: body.tipo,
    user: body.usuario,
    duration: 25,
    rates: 
      {
        user: body.usuario,
        votation: 1
      }

  };

这是我的模型:

interface IPost extends Document {
  tipo: String;
  user: Object;
  duration: number;
  rates: Object;
}

谁能解释一下我该怎么做?

问候。

【问题讨论】:

  • 但是这样做是一个非常糟糕的主意。变量键名在数据库中并不好。如果有的话,数据应该存储在Array 中。即:rates: [{ user: Schema.Types.ObjectId, votation: Number }],它会像这样存储:rates: [{ user: ObjectId("5c981a0f8a76d426dc04619e"), votation: 1 },{ "user": ObjectId("5ca01bc41a97dd8b468b3f54"), "votation": 2 }]。这对于查询来说更容易,因为索引匹配“值”而不是“键”,以及许多目的。数据库与客户端代码中的数组与对象的规则不同。
  • @NeilLunn ,谢谢你的建议,所以,现在我修改了我的代码,我的数据以这种方式存储:"rates": [ { "user": "5ca01d2c56a2d9165c848f4f", "votation": 1 }, { "user": "5ca01d2c56a2d9165c821Df", "votation": 1 } ],这是保存此类信息的最佳方式吗?谢谢。

标签: node.js mongodb


【解决方案1】:

如果您需要存储与主文档相关的键/值属性,然后将它们可视化,您可能需要mongoose maps

地图的键总是字符串。

rates: { type: Map, of: Number }

这样你就可以得到这样的东西:

rates: {"5c981a0f8a76d426dc04619e": 1}

使用此架构,您可以有多个费率,每个用户/密钥一个。

但是,正如 cmets 中所述,如果需要对这些键/值进行查询,这可能是一个次优解决方案。在这种情况下,应使用external schema reference。在这种情况下,我将使用三种模式方法:发布、用户和费率。

  • 一个帖子有多个费率
  • 一个 Rate 属于 User 和 Post 夫妇

我发现一个similar question 已经在 SO 上问过了。

【讨论】:

  • 你可以,但这样做真的很糟糕。数据库通过“索引”“快速”地做事,这基本上是它们自己的“基于键的查找”形式。特别是 MongoDB 最乐意匹配“值”而不是“键”。请参阅对问题的评论。
猜你喜欢
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多