2012-10-26 162 views
1

我存儲項目的關係,它在結構屬性:asyncmongo嵌套查詢

{'item': <item_id>, 
'rel_name': 'sizes:4762', 
'rel_type': 'sizes', 
'rel_value': '4762'} 

而且具有MongoDB的查詢,在MongoDB的外殼完美的作品:

db.relations.distinct(
    'rel_name', 
    {item:{ 
     $in: db.items.distinct('id', { 
      'attributes.cat': {$in:[477]}, 
      'attributes.sizes': {$in:[4762,5071,5072,5089,5555,903]} 
     }) 
    }} 
) 

,需要用asyncmongo運行它避免開銷獲取items.distinct的值並將其傳遞迴mongo(可能超過10000) 也許有一種方法可以將整個查詢作爲字符串傳遞並獲取結果嗎?

+0

找到解決方案。如果您不需要使用遊標並獲取所有數據(如在我的'獨特'查詢中),則可以使用db.eval。但要小心,這種方法在分片上不起作用,[默認情況下,db.eval()需要一個寫鎖定,以便在運行時阻止所有的讀/寫操作](http://www.mongodb.org/display/ DOCS /服務器端+代碼+執行) –

回答

1

這隻適用於shell和db.eval(),因爲你會運行javascript。 在結束時,你將最終需要發送2點不同的命令來蒙戈服務器

  1. 收集從db.items集合中的所有尺寸,這是在列表中您發送

  2. 匹配與與每個人的'real_name:id'。

如果您使用的是異步框架,那麼您將優化的唯一一件事就是您可以爲每個cursor.next()事件處理第二個查詢。這些仍然是2個不同的查詢,你會發送。

+0

您能否說明您的解決方案?關於遊標是好事,但是如何連接兩個查詢的遊標並避免在asyncmongo和mongo之間傳遞大量數據或者查詢大量數據?查詢每個標識會給出不同的結果,需要過濾和aggergation。 –