2012-11-09 175 views
1

我有一個MongoDB的文檔結構是這樣的:搜索多個字段陣列中的

{ 
    "user_id": 7387, 
    "first_name": "Daniel", 
    "roles": [ 
    { 
     "role_id": "509c20144fd846549e8d42ef", 
     "role_name": "Writer", 
     "is_lead": 0 
    }, 
    { 
     "role_id": "509c20344fd846549e8d42f0", 
     "role_name": "Editor", 
     "is_lead": 1 
    } 
    ] 
}, 
{ 
    "user_id": 15735, 
    "first_name": "Tom", 
    "roles": [ 
    { 
     "role_id": "509c203f4fd846549e8d42f1", 
     "role_name": "Admin", 
     "is_lead": 0 
    }, 
    { 
     "role_id": "509c20144fd846549e8d42ef", 
     "role_name": "Writer", 
     "is_lead": 1 
    }, 
    { 
     "role_id": "509c20344fd846549e8d42f0", 
     "role_name": "Editor", 
     "is_lead": 0 
    } 
    ] 
} 

如何找到誰已經roles.role_name作爲作家和roles.is_lead爲1的所有用戶(誰是所有的作家也是領先的)?

我想:

db.users.find({$and:[{"roles.role_name":"Writer","roles.is_lead":1}]}); 

在上面的例子中,它應該只返回 「湯姆」。但是,這同時返回「湯姆」和「丹尼爾」(我猜它選擇{roles.is_lead:1}「丹尼爾」的編輯角色如何解決這個查詢

感謝

回答

0

什麼?。您正在尋找的是$elemMatch,以確保您的搜索特定的元素,而不是在同一個文檔中的任何元素的混合物相匹配。

db.test.find({roles: {$elemMatch: {role_name:"Writer", is_lead:1}}}) 

原始查詢也是一樣只是做了默認的基本搜索,因爲那也將是AND。問題在於AND正在應用於文檔的任何部分。

+0

我試過了,但它返回了兩個文檔。 – Rainbard

+0

你試過我最近的更新嗎?我的第一個回答是錯誤的。但elemMatch適合我 – jdi

0

試試db.users.find({「roles.role_name」:「Writer」,「roles.is_lead」:1});

+0

我試過了,但它返回了這兩個文件。 – Rainbard