2017-10-07 71 views
0

我在MongoDB中有一堆組文檔。在這些組文檔中,每個組都有一組用戶。這個用戶數組包含JSON對象,這些JSON對象具有當前用戶組成員的用戶的id值。根據數組中的值返回整個MongoDB文檔

我在NodeJs中有一個接收ID的路由,它必須搜索所有組並返回那些在用戶數組內部具有該ID的組。

我該怎麼做?這是對象的代碼片段:

組文件:

{ 
"_id" : ObjectId("59d946c2a92b6c0f48feef19"), 
"title" : "Grupo", 
"group_id" : "1", 
"params" : [], 
"users" : [ 
    { 
     "api_id" : "1", 
     "_id" : ObjectId("59d946c2a92b6c0f48feef1a") 
    } 
], 
"__v" : 0 
} 

用戶文檔:

{ 
"_id" : ObjectId("59d9035f25691a373073f671"), 
"api_id" : "0", 
"user" : "", 
"password" : "", 
"params" : { 
    "name" : "Christian", 
    "phone" : "23453453345234234", 
    "firebase" : "KEY FOR FIREBASE GOES HERE" 
}, 
"__v" : 0 

}

哪個查詢我可以用它來做到這一點?我只傳遞api_id。我需要以JSONArray格式返回所有組,但我需要知道如何搜索它。

回答

0

我想你可以使用聚合函數。檢查這個請

db.collection.aggregate([ 
    { 
     "$match": { 
      "users._id": ObjectId("59d946c2a92b6c0f48feef1a") 
     } 
    }, 
    { 
     "$unwind": "$users" 
    }, 
    { 
     "$project": { 
      "_id": 1, 
      "users": 1 
     } 
    } 

]) 

另一種解決方案是elemMatch功能

model.find().elemMatch('users', {_id:"59d946c2a92b6c0f48feef1a"}).exec() 

model.find({users:{$elemMatch:{_id:"59d946c2a92b6c0f48feef1a"}}}).exec() 
+0

這是很好的知道這一點。 –

1

您可以使用mongodb aggregate

檢查下面這個代碼將返回其含有與匹配用戶api_id

db.parents.aggregate([{ 
     $unwind: { 
      path: "$users" 
     } 
    }, 
    { 
     $project: { 
      _id: 1, 
      title: 1, 
      group_id: 1, 
      user_id: "$users._id", 
      user_api_id: "$users.api_id", 
      params: 1 
     } 
    }, 
    { 
     $match: { user_api_id: "<Place your api id here>" } 
    }, 
    { 
     $group: { 
      _id: { _id: "$_id", group_id: "$group_id", title: "$title", user_api_id: "$user_api_id", params: "$params" } 
     } 
    }, 
    { 
     $project: { 
      _id: "$_id._id", 
      params: "$_id.params", 
      group_id: "$_id.group_id", 
      title: "$_id.title", 
      user_api_id: "$_id.user_api_id" 
     } 
    } 
]) 
所有組

快速的解釋:

$unwind:此操作將flatten用戶數組,所以這個操作的結果將是每個單用戶的文件列表group

$project:此操作將使您能夠重命名文檔字段,而不是讓用戶在每個組文檔中進行對象操作,而是在每個文檔中都有一個名爲user_id和user_api_id的字段。

$match:此操作基於特定領域將過濾的文件,在我們的例子user_api_id

$group:此操作將組具有相同_id,GROUP_ID,標題,user_api_id而params的所有文件,這個分組是隻有做是爲了避免重複的文件......我們可能會得到重複的組文件,如果一組文檔中包含具有相同api_id

超過1個用戶欲瞭解更多信息有關MongoDB的運營商檢查mongodb documentation

相關問題