在联接的“外部”文档上进行过滤时选择联接的“外部”文档上的选择?

时间:2018-07-09 20:04:39

标签: c# mongodb mongodb-.net-driver

我有两个IMongoCollection个保存类型分别为PersonAnimal的文档。

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(基于此{{3} }。尽管我不确定这是否是问题所在。


总的来说,我正在尝试join的两个IMongoCollection,其中第一个文档的字段值为另一个集合中文档的BsonId。然后,一旦加入,我想首先将第一个集合中的文档放在第二个中的字段值上。

1 个答案:

答案 0 :(得分:1)

您可以尝试执行以下操作(假设allPeople是您所有Person对象的列表,而allAnimals是您所有Animal对象的列表):

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