2015-08-19 60 views
0

我正在試圖找到一個用戶名和密碼相匹配的用戶名。 我有一個辦公室集合,每個Office文檔包含許多用戶文檔集合中的MongoDb搜索只返回完全匹配的結果 - 爲什麼?

var builder = Builders<MnOffice>.Filter; 

      var filter = builder.AnyEq(o => o.Users, new OfficeUser() 
      { 
       Username = username, 
       Password = password 
      }); 
      var office = await Offices.Find(filter).FirstOrDefaultAsync().ConfigureAwait(false); 
      return office; 

上面的查詢返回null。儘管它應該得到結果。 OfficeUser類具有三個屬性, 用戶名,密碼和名稱。 Mongo強制我所有的三個屬性將在查詢中匹配, 我所希望的是有2個屬性匹配(用戶名和密碼) 爲了得到結果, 如何做到這一點?沒有好的文件。

謝謝!

回答

0
var filter = builder.ElemMatch(o => o.Users, user => user.Username == username && user.Password == password); 

解決了使用ElemMatch,但仍然不理解第一次嘗試背後的邏輯。

+0

區別在於參數[**'$ elemMatch' **](http://docs.mongodb.org/manual/reference/operator/query/elemMatch/)本身就是另一個「查詢」。該查詢詢問「這些屬性是否與數組內的子文檔匹配」。沒有**'$ elemMatch'的區別是,它詢問「數組中的子文檔*是否匹配這個?」,就像詢問fieldA =「b」一樣,你問的是arrayC = {「d」: 「e」,「f」:g}。當然,因爲所有的元素都有更多的字段,所以沒有匹配。 –

+0

好吧,如果我想要相同的確切文檔,我必須爲查詢提供確切的模型,然後纔有意義,但是如同LINQ查詢甚至SQL查詢一樣,當您搜索並取出一個參數時,您總是會假設這在查詢本身中不會考慮到。有趣的是,知道沒有額外字段的文檔會發生什麼,它會找到那些還是不是? –

+1

我能說什麼是,這不是LINQ或SQL。同時也考慮到LINQ最初是在設計時考慮了SQL映射。 –

相關問題