我有一个具有以下结构的mongo集合:
{
"_id" : ObjectId("..."),
history : {
}
}
现在我必须更新这样的集合,推送到history
子文档新的关联对象,所以它应该如下所示:
{
"_id" : ObjectId("..."),
history : {
"06/04/2015" : {}
}
}
这样做的正确方法是什么?
答案 0 :(得分:4)
鉴于数据格式:
> db.test.insert({_id: oid, history: {} })
在嵌入文档history
中添加新的字段非常容易。您只需要$set
更新运算符,您必须使用dot-notation来指定字段:
> db.test.update({_id:oid},{$set: { "history.06/04/2015": "6 of june"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
产:
> db.test.find({_id:oid},{_id:0})
{ "history" : { "06/04/2015" : "6 of june" } }
请注意$set
操作是idempotent:
> db.test.update({_id:oid},{$set: { "history.06/04/2015": "6 of june"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
> db.test.find({_id:oid},{_id:0})
{ "history" : { "06/04/2015" : "6 of june" } }
话虽如此,正如评论中所解释的那样,这可能不是存储历史的最佳方式。仅举几例,它会阻止按日期对历史记录进行正确索引,例如。
事实上,有许多存储历史数据的不同方法。只是几个示例。他们都有(可能)专业人士和(最终)缺点:
{
history: [
{ "06/04/2015": "6 of June" },
]
}
{
history: {
"2015" : [
{ "06/04": "6 of June" },
]
}
}
{
history: {
{
year: "2015";
data: [
{ "06/04": "6 of June" },
]
}
}
}
等
BTW,使用正确的日期对象可能比使用字符串存储日期更好。我后来在这里使用它只是为了避免使示例更麻烦。
答案 1 :(得分:1)
更改您的架构(让我们称之为' Collection'对于此示例):
var grid_results = function(header_name, row) {
var grid = Ext.ComponentQuery.query('grid=itemId=gridID]')[0];
return grid.getStore().data.items[0].raw['FirstName'];
};
然后推送到包含两个键的历史数组对象,第一个是日期,其值为字符串" mm / dd / yyyy"然后第二个是数据,其值是与该日期相关联的数据对象。
现在要添加
的子目录{
_id : ObjectId,
history : [{
date: *some date*
data: {*data data data data*}
}]
}
到
的文档{date: "05/01/1944",
data: {
event: "foo",
duration: "bar"
}
你要做的就是:
{
_id: {$oid: 1},
history: []
}