将值插入数组元素中的数组元素并返回数组长度

时间:2016-03-03 17:04:57

标签: arrays mongodb

我想为一个位于数组元素中的字段添加一个值,我还希望返回数组中的元素数量,并且只允许输入一个值。以下是数据:

{
    "_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
}

但是收到错误。我一直在阅读聚合文档,但示例略显缺乏!

1 个答案:

答案 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
})