在 MongoDB 中将字段添加到上限集合中
Add a field into capped collection in MongoDB
我创建了一个上限集合来存储我的带有几个字段的日志数据。由于某些要求,我想在此集合中添加一个名为 "createAt" 的附加字段。
db.myLogs.update({},{$set: {"createAt":new Date()}})
这是抛出以下错误:
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 10003,
"errmsg" : "Cannot change the size of a document in a capped collection: 39 != 57"
}
})
如何将几个字段添加到上限集合中?
简单回答
正如 mongod 告诉您的那样,您不能。 the documentation:
If the update operation causes a document to grow beyond the document’s original size, the update operation will fail.
稍微复杂一点的答案
如果该字段不是必填字段,只需添加带有该字段的新文档并保留旧文档,对没有该字段的文档使用合理的默认值。
如果你真的需要这样做
- 停止读取和写入上限集合
- 将文档从上限集合复制到临时集合
- 根据需要更改临时集合中的文档
- 删除并重新创建上限集合
- 按所需顺序从临时集合中读取文档,并将它们插入重新创建的上限集合中。
完成“1.”后,您可以对“2.”使用类似这样的东西。在 shell:
var bulk = db.temp.initializeOrderedBulkOp();
var counter = 0;
db.capped.find().forEach(
function(doc){
bulk.insert(doc);
// In case you have a lot of documents in
// your capped collection, it makes sense
// to do an intermediate execute
if( ++counter % 10000 == 0){
bulk.execute();
bulk = db.temp.initializeOrderedBulkOp();
}
}
);
// execute the remainder
bulk.execute()
这应该很容易适应“5”。
我创建了一个上限集合来存储我的带有几个字段的日志数据。由于某些要求,我想在此集合中添加一个名为 "createAt" 的附加字段。
db.myLogs.update({},{$set: {"createAt":new Date()}})
这是抛出以下错误:
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 10003,
"errmsg" : "Cannot change the size of a document in a capped collection: 39 != 57"
}
})
如何将几个字段添加到上限集合中?
简单回答
正如 mongod 告诉您的那样,您不能。 the documentation:
If the update operation causes a document to grow beyond the document’s original size, the update operation will fail.
稍微复杂一点的答案
如果该字段不是必填字段,只需添加带有该字段的新文档并保留旧文档,对没有该字段的文档使用合理的默认值。
如果你真的需要这样做
- 停止读取和写入上限集合
- 将文档从上限集合复制到临时集合
- 根据需要更改临时集合中的文档
- 删除并重新创建上限集合
- 按所需顺序从临时集合中读取文档,并将它们插入重新创建的上限集合中。
完成“1.”后,您可以对“2.”使用类似这样的东西。在 shell:
var bulk = db.temp.initializeOrderedBulkOp();
var counter = 0;
db.capped.find().forEach(
function(doc){
bulk.insert(doc);
// In case you have a lot of documents in
// your capped collection, it makes sense
// to do an intermediate execute
if( ++counter % 10000 == 0){
bulk.execute();
bulk = db.temp.initializeOrderedBulkOp();
}
}
);
// execute the remainder
bulk.execute()
这应该很容易适应“5”。