使用排序和切片对嵌套文档进行Mongodb更新

使用排序和切片对嵌套文档进行Mongodb更新,mongodb,mongodb-query,Mongodb,Mongodb Query,文档表示一个拥有图像的用户。每个图像可以有N个与其相关的图像。我希望仅在以下情况下才能更新匹配项列表: 这场比赛确实存在 matches数组中的元素少于N个 如果它们已经是N元素,则仅当“c”参数高于当前的下限时才推送 { “用户id”:1, “imgs”:[ { “img_id”:1, “匹配项”:[ { “c”:0.3, “img_id”:2 }, { “c”:0.2, “img_id”:3 } ] }, { “img_id”:5, “匹配项”:[ { “c”:0.4, “img_id”

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

  • 这场比赛确实存在
  • matches数组中的元素少于N个
  • 如果它们已经是N元素,则仅当“c”参数高于当前的下限时才推送
{
“用户id”:1,
“imgs”:[
{
“img_id”:1,
“匹配项”:[
{
“c”:0.3,
“img_id”:2
},
{
“c”:0.2,
“img_id”:3
}
]
},
{
“img_id”:5,
“匹配项”:[
{
“c”:0.4,
“img_id”:6
}
]
}
]
}
基本上,“matches”是一个集合,但是$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 } } }
);

无法工作,因为我的文档被插入了多次

您的问题在于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 } } })