首页 > 解决方案 > 在过滤“内部”联接的文档时选择联接的“外部”文档?

问题描述

我有两个分别IMongoCollection持有类型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(基于this SO question)。虽然我不完全确定这是否是问题所在。


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

标签: c#mongodbmongodb-.net-driver

解决方案


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


推荐阅读