8

我正在处理的文档非常大。它从极长的调查(如调查猴子)中收集用户输入,并将答案存储在 mongodb 数据库中。

不出所料,我收到以下错误

Error: Document exceeds maximal allowed bson size of 16777216 bytes

如果我无法更改文档中的字段,我能做些什么吗?有没有办法通过删除空格或类似的东西来压缩文档?

编辑

这是文档的结构

Schema({
    id : { type: Number, required: true },
    created: { type: Date, default: Date.now },
    last_modified: { type: Date, default: Date.now },
    data : { type: Schema.Types.Mixed, required: true }
});

数据字段示例:

{
    id: 65,
    question: {
        test: "some questions",
        answers: [2,5,6]
    }
    // there could be thousands of these question objects
}
4

2 回答 2

6

您可以做的一件事是构建自己的 mongoDB :-)。Mongodb 是一个开放源代码,对文档大小的限制是相当随意的,以强制执行更好的模式设计。您可以修改此行并自己构建它。小心这个。

最直接的想法是将每个小问题放在一个不同的文档中,并带有一个引用其父级的字段。

另一个想法是限制 parent 中的文档数量。假设您限制为 N 个元素,则父元素如下所示:

{
  _id : ObjectId(),
  id : { type: Number, required: true },
  created: { type: Date, default: Date.now },  // you can store it only for the first element
  last_modified: { type: Date, default: Date.now }, // the same here
  data : [{
    id: 65,
    question: {
        test: "some questions",
        answers: [2,5,6]
    }
  }, ... up to N of such things {}
  ]
}

通过这种方式修改数字 N,您可以确保您将使用 16 MB 的 BSON。为了阅读整个调查,您可以选择

db.coll.find({id: the Id you need})然后结合应用层面的整个调查。也不要忘记 ensureIndex on id

尝试不同的事情,对你的数据做一个基准测试,看看什么对你有用。

于 2013-10-31T20:45:14.160 回答
0

你应该使用gridfs. 它允许您以块的形式存储文档。这是链接:http ://docs.mongodb.org/manual/reference/gridfs/

于 2013-10-31T19:45:56.453 回答