我有这样的集合:
{
"_id" : ObjectId(),
"user_id":"10"
"movie_rate":[
{
rate:2,
movie_id:"120"
},
{
rate:null,
movie_id:"230"
},
]
}
我想用电影ID更新电影费率数组元素,并为此建立一个查询:
db.rates.update({
user_id: data.user_id,
"movie_rate.movie_id": data.movie_id
}, {
$set: {
"movie_rate.$.rate": data.rate
}
}
所有电影ID都是唯一的,因此我想要更新的电影费率数组中只有一个元素;但是我的更新查询需要花费很多时间来执行,我有7000个文档,每个文档都有电影速率数组,长度为3700
我发现了另一个解决方案,首先它似乎是非常可怕的想法,我在三个查询中解决这个问题我首先找到带有查询查询和用户ID的文件,然后我循环查看电影费率数组并查找该索引元素,我想接下来更新我从带有电影ID的数组中拉出元素,最后我在数组中按下我在查询查询中找到的位置的文档,我的糟糕解决方案明显快于第一个。
这是我的拉查询:
db.rates.update(
{
user_id: data.user_id
},
{
$pull: {
movie_rate: {
movie_id: data.movie_id
}
}
}
这是我的推送查询:
db.rates.update(
{
user_id: data.user_id
},
{
$push: {
movie_rate: {
$each: [{
'rate': data.rate,
'movie_id': data.movie_id
}],
$position: index
}
}
}
那么为什么我的第二个解决方案比第一个解决方案更快?