使用排序和切片

时间:2018-03-22 11:15:47

标签: mongodb mongodb-query

该文档代表一个拥有图像的用户。每个图像可以具有与其相关的N个图像。我希望只有在以下情况下才能更新匹配列表:

  • 比赛确实存在。
  • 匹配数组中的N个元素少于
  • 如果它们已经是N元素,则只有在“c”参数高于当前值时才推送。
{
    "user_id" : 1,
    "imgs" : [
        {
            "img_id" : 1,
            "matches" : [
                {
                    "c" : 0.3,
                    "img_id" : 2
                },
                {
                    "c" : 0.2,
                    "img_id" : 3
                }
            ]
        },
        {
            "img_id" : 5,
            "matches" : [
                {
                "c" : 0.4,
                "img_id" : 6
                }
            ]
        }
    ]
}

基本上,“匹配”是一个集合,但$ addToSet不提供$ slice和$ sort,所以我尝试使用$ push。

db.stack.updateOne(
{ "user_id" : 1, "imgs.img_id" : 1, "imgs.matches.img_id" : { "$ne" : 2 } },
{ "$push" : { "imgs.$.matches" : { "$each" : [ { "c" : 0.7, "img_id" : 2} ], "$sort" : { "c" : -1 }, "$slice" : 3 } } }
);

不起作用,因为我的文档多次插入。

1 个答案:

答案 0 :(得分:1)

您的问题在于updateOne的过滤器部分。您应该使用$ elemMatch来确保过滤器仅应用于“匹配”列表中的一个元素。

{"user_id": 1, "imgs": {"$elemMatch": {"img_id" : 1, "matches.img_id": {"$ne": 2}}}}, 
{ "$push" : { "imgs.$.matches" : { "$each" : [ { "c" : 0.7, "img_id" : 2} ], "$sort" : { "c" : -1 }, "$slice" : 3 } } })