该文档代表一个拥有图像的用户。每个图像可以具有与其相关的N个图像。我希望只有在以下情况下才能更新匹配列表:
{
"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 } } }
);
不起作用,因为我的文档多次插入。
答案 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 } } })