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



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

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

但是收到错误。我一直在阅读聚合文档,但示例略有不足!

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

最新更新