c# - 在过滤“内部”联接的文档时选择联接的“外部”文档?
问题描述
我有两个分别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
两个IMongoCollection
s,其中第一个文档有一个字段,其值是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);
推荐阅读
- c# - 无法将 json 对象反序列化为模型类类型
- html - 如何为 HTML 标签设置背景颜色?
- android - Google admob“链接应用程序有问题。请稍后再试。”
- visual-studio - 退出 DotNet Watch 工具
- apache-spark - 如何在本地模式下将 2 个 python (pyspark) 脚本提交到同一个 spark 会话
- javascript - 如何在一个属性下模拟单独的对象?
- ios - 使用 Apple 登录禁用“隐藏我的电子邮件”选项
- events - 如何选择完全由康普顿散射事件组成的命中?
- mysql - 无法在 k8s 上创建两个 mysql pod
- python - 不和谐.py | 无论如何让机器人寻找它已发送的嵌入并将它们全部删除?