我有这个数据结构(带注释的类),我想添加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"
},
]
}
答案 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'
}
}
$push
operator告诉MongoDB 将新评论添加到指定的评论数组中。'classes.$.comentarios'
使用$
positional operator指定要更新的嵌套comentarios
数组。值得一提的是,如果您遇到如此深层次的嵌套结构,或许值得考虑传播课程,课程,甚至可能评论在单独的MongoDB集合中。
当嵌套文档成为可行的方式时,如果创建单独的集合更好,那么实际上很难回答这个问题 - 这里nice presentation讨论了这个问题。