2016-05-27 158 views
0

我有一個Mongo DB文檔,其中包含一個團隊數組。團隊數組中的所有對象都包含一個user_ids數組。如何查找包含user_ids包含特定對象ID的團隊的所有文檔?我正在使用Mongoose和Node。在Deep MongoDB文檔中查找對象

這是doc結構。我將如何在任何團隊中找到對象ID爲「56a60da2351195cc6be83799」的所有文檔?

{ 
"_id" : ObjectId("56a60da3351195cc6be8379c"), 
"session_id" : ObjectId("56a60da2351195cc6be83798"), 
"teams" : [ 
    { 
     "score" : 0, 
     "user_ids" : [ 
      ObjectId("56a60da2351195cc6be83799") 
     ] 
    }, 
    { 
     "score" : 0, 
     "user_ids" : [ 
      ObjectId("56a60da2351195cc6be8379a") 
     ] 
    } 
], 
"created_at" : ISODate("2016-01-25T11:57:23.006Z") } 

感謝

回答

1

比方說,您的集合名稱爲collection,嘗試:

db.collection.find({"teams.user_ids": ObjectId("56a60da2351195cc6be83799")}) 

它會找到一個文件,如果存在匹配user_ids

+0

非常感謝!如何更新該ID?對於正常的數組,我可以做{$ set:{user_ids。$:XXX}}。這不適用於兩個級別。任何想法? – BSod

+0

MongoDB確實與嵌套數組發生衝突,但是您可以在客戶端輕鬆更新。 – Saleem

0

對於嵌套數組在運營商$將是一個不錯的選擇(見documentation)。

我試圖複製您的設置並創建了一個簡單的模型:

var testSchema = mongoose.Schema({ 
    session_id: { type: Number }, 
    teams : [ 
    { 
     score: { type: Number }, 
     user_ids: [{ type: Number }] 
    } 
    ] 
}) 

var Test = mongoose.model("Test", testSchema); 

插入演示數據:

var test1 = new Test({ 
    session_id: 5, 
    teams: [ 
    { score: 5, user_ids: [ 1, 2, 4] }, 
    { score: 3, user_ids: [ 2, 7, 9 ] }, 
    { score: 1, user_ids: [ 3 ] }, 
    ] 
}); 

test1.save(function(err, t1) { console.log("test", err, t1); }); 

var test2 = new Test({ 
    session_id: 1, 
    teams: [ 
    { score: 5, user_ids: [ 11, 12 ] }, 
    { score: 3, user_ids: [ 1, 9 ] }, 
    ] 
}); 

test2.save(function(err, t2) { console.log("test", err, t2); }); 

的查詢來獲取與2用戶ID的所有物體看起來像:

Test.find({ "teams.user_ids": { $in: [2] }}, function(err, res) { 
    console.log("query:", err, res); 
}); 

或者以更加糟糕的方式重新組裝查詢:

Test.find() 
    .where('teams.user_ids') 
    .in([2]) 
    .then(result => { console.log(result); }) 
    .catch(err => { console.log(err); });