我想为一个位于数组元素中的字段添加一个值,我还希望返回数组中的元素数量,并且只允许输入一个值。以下是数据:
{
"_id" : ObjectId("56bb59beb32fa53064f51e3f"),
"title" : "okok",
"views" : 1,
"messages" : [
{
"authorId" : ObjectId("56bb599e8f308f1664c93011"),
"upvotes" : [], // <--- want to push a value here
"created" : ISODate("2016-02-10T15:39:42.006Z"),
"updated" : ISODate("2016-02-10T15:39:42.006Z"),
"message" : "okok"
},
{
"authorId" : ObjectId("56bb599e8f308f1664c93010"),
"upvotes" : [], // <--- insert into here plz
"created" : ISODate("2016-02-10T15:39:47.170Z"),
"updated" : ISODate("2016-02-10T15:39:47.170Z"),
"message" : "uhuhuh"
},
{
"authorId" : ObjectId("56bb599e8f308f1664c93011"),
"upvotes" : [],
"created" : ISODate("2016-02-10T15:40:01.772Z"),
"updated" : ISODate("2016-02-10T15:40:01.772Z"),
"message" : "åpåpå"
},
{
"authorId" : ObjectId("56bb599e8f308f1664c93010"),
"upvotes" : [],
"created" : ISODate("2016-02-10T15:40:04.889Z"),
"updated" : ISODate("2016-02-10T15:40:04.889Z"),
"message" : "påpåpå<br /><br />påå"
},
{
"authorId" : ObjectId("56bb599e8f308f1664c93010"),
"upvotes" : [],
"created" : ISODate("2016-02-11T12:36:26.006Z"),
"updated" : ISODate("2016-02-11T12:36:26.006Z"),
"message" : "testt"
},
{
"authorId" : ObjectId("56bb599e8f308f1664c93013"),
"upvotes" : [],
"created" : ISODate("2016-02-11T12:36:31.514Z"),
"updated" : ISODate("2016-02-11T12:36:31.514Z"),
"message" : "tetetet"
}
]
}
我有文档_id
和数组元素created
字段来定位数组中的元素。
我尝试了以下内容:
}
$match: {
_id: retard.ObjectId(data.id),
'messages.created': data.created
}
}, {
$group: {
'messages.$.upvotes': {
$addToSet: 'myTestValueToInsert'
}
}
}, {
$project: {
numUpvotes: {
$size: '$upvotes'
}
}
}, {
multi: false
}
但是收到错误。我一直在阅读聚合文档,但示例略显缺乏!
答案 0 :(得分:1)
aggregation
框架无意也不能用于插入或更新文档(this
是扩展功能而非例外),而可以处理数据记录并返回计算结果。
您可以使用update
查询来更新匹配的子文档:
var myTestValueToInsert = 1;
db.t.update({
"_id":retard.ObjectId(data.id),
"messages.created":data.created
},
{
"$addToSet":{"messages.$.upvotes":myTestValueToInsert}
})
然后,要检索已修改数组的大小,可以按以下方式聚合:
db.t.aggregate([
{$match:{"_id":retard.ObjectId(data.id)}},
{$unwind:"$messages"},
{$match:{"messages.created":data.created}},
{$project:{"size":{$size:"$messages.upvotes"},"_id":0}}
])
如果您正在使用shell,那么有一个很好的wrapper
来更新并获取更新的文档,但您需要在客户端获取文档中的数组大小:
db.t.findAndModify({
"query":{"_id":retard.ObjectId(data.id),"messages.created":data.created},
"update":{$addToSet:{"messages.$.upvotes":myTestValueToInsert}},
"new":true
})