mongodb-csharp 驱动程序 - 如何将属性保存为引用而不是嵌入?

标签 mongodb mongodb-.net-driver

我们正在为我们的 C#.NET 项目在 Mongo DB 上做一个小峰值,看看它是否适合我们,我在 samus 的 mongodb-csharp 驱动程序上遇到了一个小问题,我不确定如何实现。

给定以下简化模型:

public class Campaign
{        
    public string Name { get; set; }
    public IEnumerable<Placement> Placements { get; set; }
}

public class Placement
{
    public string Name { get; set; }

    //this should be a reference rather than included in the collection
    public Site Site { get; set; }
}

//this should be its own collection, and not embedded anywhere
public class Site
{
    public string Name { get; set; }
}

正如上面的评论所暗示的,我们正试图弄清楚如何将站点保存为引用类型,而不是嵌入到展示位置中。网站是它自己的顶级集合,独立于每个广告系列而变化。

理想情况下,我想使用 MongoConfigurationBuilder 来执行此操作,而不必修改我的 POCO。我似乎找不到任何有关如何完成此操作的文档。

我希望它会像这样简单:

var config = new MongoConfigurationBuilder();

config.Mapping(mapping =>
{
    //maybe some more configuration here?
    mapping.Map<Site>();
    mapping.Map<Campaign>();
});

但是当我使用以下代码时,它仍然是嵌入站点:

var db = mongo.GetDatabase("foo");

var campaignCollection = db.GetCollection<Campaign>();
var siteCollection = db.GetCollection<Site>();

var firstSite = new Site{Name = "first site"};
var secondSite = new Site{Name = "second site"};

var firstCampaign = new Campaign
{
    Name = "first campaign",
    Placements = new List<Placement>
    {
        new Placement{Name = "first placement", Site = firstSite},
        new Placement{Name = "second placement", Site = secondSite}
    }
};

siteCollection.Save(firstSite);
siteCollection.Save(secondSite);

campaignCollection.Save(firstCampaign);

这是给我们的:

{ "_id" : ObjectId("4ca9f1db54730000000010cb"), 
  "Name" : "first campaign", 
  "Placements" : [
    {
      "Name" : "first placement",
      "Site" : { "Name" : "first site" }
    },
    {
      "Name" : "second placement",
      "Site" : { "Name" : "second site" }
    }
  ]}

{ "_id" : ObjectId("4ca9f1db54730000000010c9"), "Name" : "first site" }
{ "_id" : ObjectId("4ca9f1db54730000000010ca"), "Name" : "second site" }

而我们想要的更像是:

{ "_id" : ObjectId("4ca9f1db54730000000010cb"), 
  "Name" : "first campaign", 
  "Placements" : [
    {
      "Name" : "first placement",
      "Site" : ObjectId("4ca9f1db54730000000010c9")
    },
    {
      "Name" : "second placement",
      "Site" : ObjectId("4ca9f1db54730000000010ca")
    }
  ]}

{ "_id" : ObjectId("4ca9f1db54730000000010c9"), "Name" : "first site" }
{ "_id" : ObjectId("4ca9f1db54730000000010ca"), "Name" : "second site" }

我不确定这是否是我们最终得到的确切文件,但你明白了。

我觉得好像我遗漏了一些明显的东西,但是如果没有更好的关于驱动程序这方面的文档,我有点在黑暗中拍摄。我什至查看了源代码中的测试,但无法弄清楚。

有人知道怎么做吗?有可能吗?

最佳答案

为此,您必须使用 DBRef .

要在 c# 中执行此操作,您必须像这样更改广告系列类

public class Campaign
{        
    public string Name { get; set; }
    public List<DBRef> Placements { get; set; }
}

并像这样插入引用文档

List<DBRef> refList = new List<DBRef>() {firstSite,secondSite };


var firstCampaign = new Campaign
{
    Name = "first campaign",
    Placements = refList
};

campaignCollection.Save(firstCampaign);

我还没有测试过代码,但这给出了如何完成的提示。

关于mongodb-csharp 驱动程序 - 如何将属性保存为引用而不是嵌入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3857214/

相关文章:

MongoDB AggregationOutput 响应时间更长

c# - MongoDb BsonClassMap

mongodb - 无法将 mongo 数据库日志写入系统日志

java - 使用 And 运算符进行 spring data mongodb 全文搜索

mongodb - 使用 Go 插入和查询 MongoDB 数据

c# - MongoDB 选择与 QueryBuilder

c# - 带有字符串参数的 MongoDb c# Driver typed Builder

c# - 有没有办法创建或更新 MongoDB 索引?

mongodb - 使用 NoRM for MongoDB 中的 HiLoIdGenerator 创建唯一标识符

c - json_object_to_json_string 返回 'c' 中不带引号的值