2012-05-22 2 views
0

В качестве предисловия я использую Node.js с Mongo-db-native.Производительность группы MongoDB в node.js

Я также использую GridFS для хранения изображений, и каждое изображение имеет метаданные, одним из которых является идентификатор продукта.

Я хочу запросить все fs.files и вернуть изображения, связанные с определенным продуктом.

Вот как я сейчас делаю это:

this.collection.ensureIndex({ 
    product_id: 1, 
}, function (err, edIndex) { 
    self.collection.group(   ['group'] , { 
     "product_id": ObjectID(product_id) 
    } , { 
     docs: [] 
    } , function (doc, prev) { 
     prev.docs.push({ 
      width: doc.width, 
      height: doc.height, 
      _id: doc._id 
     }); 
    } , true , function (err, results) {  
     if (err) { 
      callback(err) 
     } else { 
      callback(null, results) 
     }  
    }); 
}); 

Я нахожу, что это очень медленно. Есть ли у кого-нибудь предложения в качестве альтернативы или как повысить эффективность этого?

Спасибо!

+0

Вы уверены, что разместили правильный код? – Martin

+0

makeIndex() создает индекс, поэтому нет необходимости вызывать его для каждого запроса. – Martin

ответ

1

Вот простой запрос в синтаксисе оболочки Mongo, который найдет все файлы GridFS с ProductId = 42 в своих метаданных.

db.fs.files.find({"metadata.ProductId": 42}); 

Возвращенные документы будут содержать имя файла, которое можно использовать с GridStore из mongo-native.

+0

Ну, еще немного происходит, я строю новый массив на основе размеров, но, я думаю, я мог бы сделать это за пределами монго, не используя групповой агрегат. – dzm

+0

Снижение карты, которое лежит за группой монго-родных, отлично подходит для некоторых проблем. Я нахожу это излишним для чего-то столь же простого, как добавление результатов в новый массив. – Martin

Смежные вопросы