代码之家  ›  专栏  ›  技术社区  ›  KDecker

选择连接的“外部”文档,过滤“内部”文档?

  •  0
  • KDecker  · 技术社区  · 6 年前

    我有两个 IMongoCollection S持有文件类型 Person Animal 分别是。

    public class Person
    {
        public Guid PersonId { get; set; } = Guid.NewGuid();
        public Guid PetId { get; set; }
    }
    
    public class Animal
    {
        public Guid AnimalId { get; set; } = Guid.NewGuid();
        public bool IsMammal { get; set; } 
    }
    ...
    Animal bootsTheMonkey = new Animal() { IsMammal = true };
    Person doraTheExplorer = new Person() { PetId = bootsTheMonkey.AnimalId };
    

    我试图写一个查询,找到“所有宠物是哺乳动物的人”。

    var query =
        from pDoc in PersonDocumentCollection.AsQueryable()
        where !pDoc.PetId.Equals(Guid.Empty)
        join aDoc in AnimalDocumentCollection.AsQueryable() on pDoc.PetId equals aDoc.AnimalId
            where aDoc.IsMammal
        select pDoc;
    

    尽管此查询不正确,但错误消息表明

    $project或$group不支持{document}。

    从搜索来看,这个错误似乎是由于 where aDoc.IsMammal ,更具体地说,使用 aDoc 在…之内/之后 join (基于此 SO question )中。尽管我不完全确定这是否是问题所在。


    总的来说我想 参加 伊蒙戈收藏 第一个文档的字段值为 BsonId 来自另一个集合的文档。然后,一旦加入,我想首先从第一个集合中获取文档,然后在第二个集合中获取字段的值。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Kevin Mee    6 年前

    你可以尝试这样做(假设allpeople是你所有的person对象的列表,allanimals是你所有的动物对象):

    var query = allPeople    
                .Join(allAnimals, 
                      p => p.PetId,        
                      a => a.AnimalId,   
                      (p, a) => new { P = p, A = a }) 
                .Where(PA => PA.A.IsMammal == true);    
    

    https://dotnetfiddle.net/8lw5ye