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

Json 将新的关键元素推入mongodb的子文档,json,mongodb,Json,Mongodb,我有一个具有以下结构的mongo集合: { "_id" : ObjectId("..."), history : { } } 现在我必须更新这样的集合,将其推入历史子文档新的关联对象,使其看起来像: { "_id" : ObjectId("..."), history : { "06/04/2015" : {} } } 正确的方法是什么?鉴于该数据格式: > db.test.insert({_id: oid, history: {}

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

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

   }
}
现在我必须更新这样的集合,将其推入
历史
子文档新的关联对象,使其看起来像:

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

正确的方法是什么?

鉴于该数据格式:

> db.test.insert({_id: oid, history: {} })
在嵌入式文档
history
中添加新字段非常容易。您只需要update操作符,并且必须使用指定字段:

> 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
操作是:


尽管如此,正如评论中所解释的,这可能不是存储历史的最佳方式。只需提及,它将阻止按日期对历史进行适当的索引,例如

事实上,有许多不同的方法来存储历史数据。只有几个例子。它们都有(可能)优点和(肯定)缺点:

等等


顺便说一句,使用适当的日期对象可能比使用字符串存储日期要好。我稍后在这里使用它只是为了避免使示例变得更麻烦。

更改您的模式(对于本例,我们将其称为“集合”):

然后推送到包含两个键的历史数组对象,第一个是日期,其值为字符串“mm/dd/yyyy”,第二个是数据,其值为与该日期关联的数据对象

现在,当您要添加的子文档

{date: "05/01/1944",
 data: {
   event: "foo",
   duration: "bar"
}
与医生见面

{
  _id: {$oid: 1},
 history: []
}
你所做的就是:

var mongoose = require('mongoose');
var ObjectId = mongoose.Types.ObjectId;
var collections = mongoose.model('Collection');
var id = *_id of what you want to add to, in this case "1"*;
var change =  {date: "05/01/1944",
 data: {
   event: "foo",
   duration: "bar"
}

collections.update({
  _id: new ObjectId(id)
}, {$push:{history: change}});

在MongoDB中,使用动态值作为文档中的键被认为是不好的设计实践,它变得很难更新。@chridam最好是制作
历史
-数组并使用
$push
?绝对正确,但这取决于信息的更改频率或读取频率。如果定期更新历史,那么将其正常化将是一个好主意。如果不经常更改,则以应用程序执行的每次读取为代价优化更新过程几乎没有什么好处。FWIW,“历史记录”的目标是在大多数情况下按日期范围返回数据(例如“2014年6月的数据”)。这对你最初的设计来说并不容易。@chridam,但有了这样的设计,很难获得确切日期的历史。顺便说一句,插入后历史记录项不会更改。唯一的操作-追加新的历史记录项并按确切日期搜索。
{
  history: {
    {
      year: "2015";
      data: [
        { "06/04": "6 of June" },
      ]
    }
  }
}
{
   _id : ObjectId,
    history : [{
   date: *some date*
   data: {*data data data data*}
  }]
}
{date: "05/01/1944",
 data: {
   event: "foo",
   duration: "bar"
}
{
  _id: {$oid: 1},
 history: []
}
var mongoose = require('mongoose');
var ObjectId = mongoose.Types.ObjectId;
var collections = mongoose.model('Collection');
var id = *_id of what you want to add to, in this case "1"*;
var change =  {date: "05/01/1944",
 data: {
   event: "foo",
   duration: "bar"
}

collections.update({
  _id: new ObjectId(id)
}, {$push:{history: change}});