将新的键元素推入mongodb的子文档中

时间:2015-06-04 18:06:04

标签: json mongodb

我有一个具有以下结构的mongo集合:

{
   "_id" : ObjectId("..."),
   history : {

   }
}

现在我必须更新这样的集合,推送到history子文档新的关联对象,所以它应该如下所示:

{
   "_id" : ObjectId("..."),
   history : {
        "06/04/2015" : {}
   }
}

这样做的正确方法是什么?

2 个答案:

答案 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: []
}