在过滤文档 "within" 连接时选择连接文档 "outside"?

Selecting on document "outside" of join while filtering on documents "within" join?

我有两个 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 };

我正在尝试编写一个查找 "all persons whose pets are mammals".

的查询
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 or $group does not support {document}.

从搜索来看,这个错误似乎是由 where aDoc.IsMammal 的使用引起的,更具体地说是 aDoc within/after join 的使用(基于此SO question)。虽然我不完全确定这是否是问题所在。


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

您可以尝试这样做(假设 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