2016-07-22 31 views
0

我想從mongodb中獲取大量用戶的詳細信息。 用戶列表超過10萬。由於mongodb一次不支持非常龐大的數據查詢。 我想知道哪些是獲取數據的最佳方式。在基團查詢mongodb中的巨大列表的最快方法

  1. 鴻溝列表,並獲得數據

groups_of_list包含具有10000

for group in groups_of_list: 
    curr_data = db.collection.find({'userId': {'$in': group}}) 
    data.append(curr_data) 
  • 束用戶id的列表循環收集
  • for doc in db.collection.find({}): 
        if i['userId'] in set_of_userIds: 
         data.append(doc) 
    

    我想要得到的禁食方法。

    如果有更好的方法/方法,請指出。

    +0

    你可以在db.collection的結構上添加一些細節嗎?這將使得幫助變得更容易。 – learn2day

    回答

    1

    恕我直言,你應該把它分成「合理大小」的塊,就像你指出的方法1一樣,不是因爲Mongo的限制,而是因爲你自己的機器的內存限制。

    它可能應該是這樣的:

    def get_user_slice_data(groups_of_list): 
        for group in groups_of_list: 
         yield list(db.collection.find({'userId': {'$in': group}})) 
    

    該發生器功能,可以像這樣使用:

    for use_slice_data in get_user_slice_data(groups_of_list): 
        # do stuff 
    

    通過這樣做,你將是既避免其數據的大金額在內存中,並減少Mongo交易的規模。

    PD:你應該考慮增加一個索引「用戶id」第一,如:

    db.collection.ensure_index('userId') 
    
    0

    您可以使用遊標與固定的限制和迭代使用光標的結果。你可以在這裏找到更多的信息 - https://docs.mongodb.com/v3.2/tutorial/iterate-a-cursor/

    但是實際的代碼實現取決於你使用的語言。如果是春天,例如,你可以使用可分頁請求的Java應用程序,像

    Pageable pageable = new PageRequest(0, 50); 
    Query query = new Query(); 
    query.with(pageable); 
    
    mongoTemplate.find(query, User.class); 
    
    //get the next page 
    pageable = pageable.next(); 
    

    不過,千萬記住,如果你正在更新您的數據你迭代它,它可能會產生不一致的結果。所以,在這種情況下,您必須使用快照進行查詢。 https://docs.mongodb.com/manual/reference/method/cursor.snapshot/

    希望它有幫助!

    +0

    感謝Puran幫助。 –

    +0

    如果你認爲它有幫助,你應該接受答案:) – Puran

    相關問題