我正在使用官方的C#MongoDb强类型驱动程序版本2.8.0与MongoDB进行交互。
请考虑以下课程:
public class Author {
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string BirthDate { get; set; }
public string ScientificDegree { get; set; }
}
public class Book
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string AuthorId {get; set;}
public string Title { get; set; }
public int PublishYear { get; set; }
public string Content { get; set; }
public bool IsVerified { get; set; }
public int DownloadCount {get; set; }
}
如何通过作者文档中的Id字段和书籍文档中的AuthorId字段(不使用Linq以及使用查找运算符和聚合框架)来(一对一)联接这两个集合。
答案 0 :(得分:1)
如果使用Visual Studio的peek定义,它将显示期望的Lookup,如下图所示,用红色包围。
第一个Lookup是IMongoCollection的扩展。它在集合的上下文中执行,并且需要外键集合作为第一个参数,然后是建立关系的本地字段,构成关系的外字段,最后是结果类型。不幸的是,结果类型不能是匿名类型(或者我没有发现如何匿名?)。一如既往地期望从外部集合中返回不止一个元素,因此,运算符始终希望返回一个数组。
对于您而言,结果将显示在下面的代码段中。您还应该创建“ LookedUpBooks”类。
var result = await collBooks.Aggregate()
.Lookup<Books, Authors, LookedUpBooks>(collAuthors,
x => x.AuthorId,
y => y.Id,
y => y.LastName
).ToListAsync();
public class LookedUpBooks
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string Title { get; set; }
// Add more properties as you need
public IEnumerable<Authors> InnerAuthors { get; set; }
}
答案 1 :(得分:0)
您可以使用MongoDB.Entities包装器库轻松地进行一对一,一对多,多对多关系。以下是如何与两个不同的集合进行一对一的关系。
using System.Linq;
using MongoDB.Entities;
namespace Library
{
public class Author : Entity
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Book : Entity
{
public string Title { get; set; }
public One<Author> MainAuthor { get; set; } // one-to-one relationship
}
class Program
{
static void Main(string[] args)
{
new DB("library");
var author1 = new Author
{
FirstName = "Eckhart",
LastName = "Tolle"
};
author1.Save();
var book1 = new Book
{
Title = "The Power Of Now",
MainAuthor = author1.ToReference()
};
book1.Save();
var powerOfNow = DB.Collection<Book>()
.Where(b => b.Title.Contains("Now"))
.FirstOrDefault();
var eckhartTolle = powerOfNow.MainAuthor.ToEntity();
}
}
}