Итак, у меня есть экземпляр MongoDB, где я пытаюсь обновить данные в одной коллекции данными из другой коллекции. Две коллекции: participants
с документами около 180 тыс. И questions
с документами около 95 тыс. Документов.Настройка производительности MongoDB запрос/обновление?
Документы в participants
обычно выглядит примерно так:
{
"_id" : ObjectId("52f90b8bbab16dd8594b82b4"),
"answers" : [
{
"_id" : ObjectId("52f90b8bbab16dd8594b82b9"),
"question_id" : 2081,
"sub_id" : null,
"values" : [
"Yes"
]
},
{
"_id" : ObjectId("52f90b8bbab16dd8594b82b8"),
"question_id" : 2082,
"sub_id" : 123,
"values" : [
"Would prefer to go alone"
]
},
{
"_id" : ObjectId("52f90b8bbab16dd8594b82b7"),
"question_id" : 2082,
"sub_id" : 456,
"values" : [
"Yes"
]
}
],
"created" : ISODate("2012-03-01T17:40:21Z"),
"email" : "anonymous",
"id" : 65,
"survey" : ObjectId("52f41d579af1ff4221399a7b"),
"survey_id" : 374
}
Я использую запрос ниже, чтобы выполнить обновление:
db.participants.ensureIndex({"answers.question_id": 1, "answers.sub_id": 1});
print("created index for answer arrays!")
db.questions.find().forEach(function(doc){
db.participants.update(
{
"answers.question_id": doc.id,
"answers.sub_id": doc.sub_id
},
{
$set:
{
"answers.$.question": doc._id
}
},
false,
true
);
});
db.participants.dropIndex({"answers.question_id": 1, "answers.sub_id": 1});
Но это занимает около 20 минут, чтобы бежать. Я надеялся, что добавление индекса поможет в производительности, но это все еще довольно медленно. Правильно ли этот индекс настроен, учитывая, что я индексирую поля в массиве объектов? Может ли кто-нибудь увидеть что-нибудь, что я делаю, что приведет к медлительности? Предложения о том, с чего начать искать повышение эффективности этого запроса?
Какой смысл вызывать dropIndex после запроса? Как насчет результата «explain()» вашего запроса? db.participants.find ({ "answers.question_id": doc.id, "answers.sub_id": doc.sub_id }) объяснить() – yaoxing
Я думаю, что это будет намного быстрее, если вы могли бы выразить. это как задание mapreduce, таким образом все это будет выполняться на сервере базы данных без привлечения сети. – leif
Чтобы уточнить, нет отдельного приложения, выполняющего этот скрипт. Это чистый скрипт MongoDB, который я выполняю из оболочки. С учетом сказанного, вы все еще думаете, что сеть задействована? –