2017-03-02 80 views
0

下面是我收集rolesandresponsibilities文檔的如何查詢子數組中條目與所有條件匹配的文檔?

[{ 
    "_id": { 
     "$oid": "58b6c380734d1d48176c9e69" 
    }, 
    "role": "Admin", 
    "resource": [ 
     { 
      "id": "blog", 
      "permissions": [ 
       "read", 
       "update", 
       "delete" 
      ] 
     }, 
     { 
      "id": "user", 
      "permissions": [ 
       "create", 
       "read", 
       "update", 
       "delete" 
      ] 
     }, 
     { 
      "id": "journal", 
      "permissions": [ 
       "create", 
       "read", 
       "update", 
       "delete" 
      ] 
     } 
    ] 
}, 
{ 
    "_id": { 
     "$oid": "58b7db3cf36d285019ea175f" 
    }, 
    "role": "Manager", 
    "resource": [ 
     { 
      "id": "blog", 
      "permissions": [ 
       "read", 
       "update", 
       "delete" 
      ] 
     }, 
     { 
      "id": "user", 
      "permissions": [ 
       "create", 
       "read", 
       "update", 
       "delete" 
      ] 
     }, 
     { 
      "id": "journal", 
      "permissions": [ 
       "create", 
       "read", 
       "update", 
       "delete" 
      ] 
     } 
    ] 
}] 

我要檢查管理員擁有創建訪問與否。 我寫這樣的查詢

var check = { $and: [ { 'role':req.body.role, }, { 'resource.id':'blog'},{'resource.permissions':'create'} ] } 
Rolesandresponsibilitie.find(check).populate('user', 'displayName').exec(function(err, rolesandresponsibilities) { 
     if (err) return next(err); 
     if (! rolesandresponsibilities) return res.status(404).send('Not Found'); }; 
     return res.status(200).send('Found'); } 

    }); 

我越來越不確定

我的意料:

例如1:

角色=管理

ID =博客

權限=創建

我應該得到響應未找到,因爲管理員只

「權限」: 「讀」, 「更新」, 「刪除」 ]

上述3權限

示例2:

role =管理

ID =博客

權限=讀

我應該得到響應發現,由於管理員具有讀取權限

回答

1

你需要的,如果你想在子文件數組來查詢使用$ elemMatch,並且希望以每個子文檔爲基礎進行條件。

var check = { $and: [ { 'role':req.body.role, }, { resource: { $elemMatch: { 'id': 'blog', 'permissions': 'create' } } } ] } 

如上所述改變條件。

+0

感謝您的幫助 –

2

$ elemMatch是你所需要的,它會簡化查詢。 默認情況下,mongo會將查詢中的屬性視爲$和statement,因此不需要在這裏添加。

一個簡單的查詢是

var check = { 
    'role':req.body.role, 
    'resource':{ 
     '$elemMatch': { 
      'id': 'blog', 
      'permissions': 'create' 
     } 
    } 
} 

Rolesandresponsibilitie.find(check).populate('user', 'displayName').exec(function(err, rolesandresponsibilities) { 
    if (err) return next(err); 
    if (! rolesandresponsibilities) return res.status(404).send('Not Found'); }; 
    return res.status(200).send('Found'); } 

}); 

您在最新一期是因爲上查詢

'resource.id':blog and 'resource.permissions':create 

是,你必須在陣列中同時匹配濾波器的元素。 它只是簡單地檢查資源數組以確定是否有id = blog,並且如果某項具有permissions = create,並且結果不一定必須是數組中的相同條目。

祝你好運!

+0

感謝您的解釋 –

+0

沒問題,當我開始使用mongodb時,我掙扎於此。 很高興認爲它有幫助 –

+0

http://stackoverflow.com/questions/43501008/how-to-do-find-in-node-and-mongodb .help –

相關問題