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

Adding object to array in array in MongoDB

我有这个数据结构(类带评论),我想添加一个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"
                },
]
}

一个扭曲的例子!

幸运的是,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 运算符,我们将查询结果限制为仅包含一个 class:

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

现在,找到要更新的特定class,我们终于可以添加新的评论了。这是我们的更新查询:

$push: {
  'classes.$.comentarios': {
    nombreUsuario: 'New comment nombreUsuario',
    texto: '111242515'
  }
}
  1. $push operator 告诉 MongoDB 添加 新评论到指定的评论数组。
  2. 'classes.$.comentarios' 指定要更新的嵌套 comentarios 数组,使用 $ positional operator.
  3. 最后,这部分应该是不言自明的:要添加到指定 class.
  4. 的新评论的完整对象

还值得一提的是,如果您 运行 进入如此深层嵌套的结构,也许值得考虑传播 课程classes,甚至可能 comments 在单独的 MongoDB 集合上。

何时需要嵌套文档以及何时最好创建单独的集合实际上是一个很难回答的问题 - 这里 nice presentation 讨论了这个问题。