在MongoDB中将对象添加到数组中的数组

时间:2015-07-10 20:28:06

标签: arrays mongodb nested

我有这个数据结构(带注释的类),我想添加1级深度回复。这意味着我想在“comentarios”元素上添加另一个对象。

我如何用mongo实现这一目标? 这意味着:匹配cursada(db)id,匹配clase(第一个数组)id,匹配comment(第二个数组)id,然后在那里添加一个新元素。

db.cursada.find({"_id": ObjectId("55444f56e5e154f7638b456a")}).pretty()
{
        "_id" : ObjectId("55444f56e5e154f7638b456a"),
        "clases" : [
                {
                        "_id" : "554e7f2fe5e154797d8b4578",
                        "titulo" : "qewewqewq"
                },
                {
                        "_id" : "554e8be0e5e154dc698b4582",
                        "titulo" : "la mejor clase"
                },
                {
                        "_id" : "554eb90de5e154dd698b458b",
                        "comentarios" : [
                                {
                                        "_id" : ObjectId("55a021afe5e154cf098b4567"),
                                        "nombreUsuario" : "nombre",
                                        "texto" : "432432423"
                                }
                        ],
                        "titulo" : "Peeling - cosa"
                },
                {
                        "_id" : "554e91a0e5e154797d8b4587",
                        "titulo" : "fdsfdsa"
                },
                {
                        "_id" : "554f8f50e5e154dd698b458f",
                        "titulo" : "clase2"
                },
                {
                        "_id" : "554f99dae5e154797d8b45a7",
                        "titulo" : "con profesor"
                },
                {
                        "_id" : "554fa4a0e5e154797d8b45c4",
                        "titulo" : "profesor nombre nombre"
                },
                {
                        "_id" : "5557b37be5e154e07f8b4567",
                        "titulo" : "Dermatologia I"
                },
                {
                        "_id" : "5557c701e5e154066d8b456c",
                        "titulo" : "Acido hialuronico"
                }
        ],
        "curso" : "552fa5f1e5e1542e628b4567",
        "fechaFin" : "2015-05-22T03:00:00.000Z",
        "fechaIni" : "2015-05-08T03:00:00.000Z",
        "titulo" : "cremotas"
}

获得此结果:

  {
            "_id" : ObjectId("55444f56e5e154f7638b456a"),
            "clases" : [
                  {
                        "_id" : ObjectId("554eb90de5e154dd698b458b"),
                        "comentarios" : [
                                {
                                        "_id" : ObjectId("55a021afe5e154cf098b4567"),
                                        "nombreUsuario" : "nombre",
                                        "texto" : "432432423",
                                        ----------------HERE
                                        "replies": [
                                        { "_id": ....,
                                        "user": ....,
                                        "text":....,
                                        "date":....
                                        }]
                                        ----------------HERE

                                }
                        ],
                        "titulo" : "Peeling - cosa"
                },
]
}

1 个答案:

答案 0 :(得分:0)

一个扭曲的例子!

幸运的是,MongoDB及其$elemMatch查询运算符没有问题:

Model.update({
  _id: "55444f56e5e154f7638b456a",
  classes: {
    $elemMatch: {
      _id: "554eb90de5e154dd698b458b",
    }
  }
}, {
  $push: {
    'classes.$.comentarios': {
       nombreUsuario: 'New comment nombreUsuario',
      texto: '111242515'
    }
  }
}, function(err, count) {
  console.log('Updated ' + count + ' document');
});

这里发生了什么?

首先,我们要更新特定的课程" cursada" )进行更新:

_id: "55444f56e5e154f7638b456a"

然后,使用$elemMatch运算符,我们将查询结果限制为仅包含一个

  classes: {
    $elemMatch: {
      _id: "554eb90de5e154dd698b458b",
    }
  }

现在,在找到要更新的特定后,我们最终可以向其添加新的注释。这是我们的更新查询:

$push: {
  'classes.$.comentarios': {
    nombreUsuario: 'New comment nombreUsuario',
    texto: '111242515'
  }
}
  1. $push operator告诉MongoDB 新评论添加到指定的评论数组中。
  2. 'classes.$.comentarios'使用$ positional operator指定要更新的嵌套comentarios数组。
  3. 最后,这部分应该是不言自明的:要添加到指定的的新注释的完整对象。
  4. 值得一提的是,如果您遇到如此深层次的嵌套结构,或许值得考虑传播课程课程,甚至可能评论在单独的MongoDB集合中。

    当嵌套文档成为可行的方式时,如果创建单独的集合更好,那么实际上很难回答这个问题 - 这里nice presentation讨论了这个问题。