2012-11-09 127 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