2016-09-15 72 views
0

我想基於子文檔數組值獲取集合中的所有文檔。這就是我正在尋找在收集我的數據結構:基於嵌套的subdoc數組值獲取文檔

{ 
    _id: ObjectId('...'), 
    name: "my event", 
    members: 
    [ 
     { 
      _id: ObjectId('...'), 
      name: "family", 
      users: [ObjectId('...'),ObjectId('...'),ObjectId('...')] 
     }, 
     { 
      _id: ObjectId('...'), 
      name: "work", 
      users: [ObjectId('...'),ObjectId('...'),ObjectId('...')] 
     } 
    ] 
} 

我應該指出的是,這些對象的架構中,像這樣定義:

活動:

{ 
    name: { type: String }, 
    members: {type: [{ type: ObjectId, ref: 'MemberGroup' }], default:[] } 
} 

MemberGroup:

{ 
    name: { type: String }, 
    users: [{type: mongoose.Schema.Types.ObjectId, ref: 'User'}] 
} 

當然,用戶只是一個帶id的任意對象。

我想要獲取的內容:我想檢索所有在其member.users字段中具有特定用戶標識的事件。

我不知道,如果它的事件可能在一個單一的呼叫,但這裏是我已經試過:

var userId = new mongoose.Schema.ObjectId('57d9503ef10d5ffc08d6b8cc'); 
events.find({members: { $elemMatch : { users: { $in: [userId]} } }}) 

這句法工作,但不會返回任何元素,即使我知道有匹配的元素(使用robomongo以可視化的DB)

+0

語法錯誤 - 4個左捲曲和5個右捲曲(也缺少右右括號)。我修正了語法,它的工作原理是:db.events.find({members:{$ elemMatch:{users:{$ in:[userId]}}}})' – TomG

+0

@Tom nope,這只是一個複製粘貼錯字 –

+0

我明白,但正如我所說,當我運行此查詢它的作品。所以我想你會忘記別的東西... – TomG

回答

0

所以在計算器經過長時間的搜尋後,我遇到了好answare這裏:

MongoDB: How to find out if an array field contains an element?

我的查詢改爲這給了我我想要的結果如下:

var userId = new mongoose.Schema.ObjectId('57d9503ef10d5ffc08d6b8cc'); 
events.find({}, {members: { $elemMatch : { users: { $eq: userId} } }}) 

通知使用第二個find參數指定查詢的限制,而不是第一個(這是奇怪)