Mongodb c#更新n嵌套注释链中的注释

本文关键字:注释 嵌套 更新 Mongodb | 更新日期: 2023-09-27 18:09:58

我发现了一些关于更新父文档的子文档的问题,但只有当您已经知道父/子树的长度时才会这样。这是我的模型:

public class ParentThread
{
    public string id { get; set; }
    public string title { get; set; }
    public string body { get; set; }
    public List<Comment> Comments { get; set; }
}
public class Comment
{
    public string id { get; set; }
    public string body { get; set; }
    public List<Comment> Comments { get; set; }
}

我需要能够使用Mongodb的更新功能发送新的评论到父线程,而不提交完整的线程。这是为了避免多个用户同时添加线程以及数据库覆盖它们的问题。麻烦的是,我不知道如何指定mongodb在树下需要走多远,以便将用户的评论添加到线程。

我已经弄清楚如何查询文档并遍历树以找到要添加的目标注释,但是我在弄清楚如何将其作为Update.Push()方法的第一个参数传递时遇到了麻烦。什么好主意吗?

Mongodb c#更新n嵌套注释链中的注释

有几种推荐的树形结构建模方法。看看官方文件中的家长推荐信吧。这将线性化你的树。父引用模式将每个树节点存储在文档中。除了树节点之外,文档还存储节点父节点的id。我的建议如下:

// item is the base, comment is a thread comment, reply is a comment to a comment
public enum ItemType { Item, Thread, Comment, Reply }
public class Item {
  [BsonId] public string Id { get; set; }
  [BsonElement("body")] public string Body { get; set; }
  [BsonRepresentation(MongoDB.Bson.BsonType.String)]
  [BsonElement("type")] public virtual ItemType Type { get { return ItemType.Item; } }
  [BsonDefaultValue(null)]
  [BsonElement("parent")] public string ParentId { get; set; }
  [BsonDefaultValue(null)]
  [BsonElement("title")] public string Title { get; set; }
  public override string ToString() { return String.Format("{0};{1};{2};{3};{4}", Id, Type, ParentId, Body, Title); }
}
public class Thread : Item { public override ItemType Type { get { return ItemType.Thread; } } }
public class Comment : Item { public override ItemType Type { get { return ItemType.Comment; } } } 
public class Reply : Item { public override ItemType Type { get { return ItemType.Reply; } } }

如何查找项目,驱动程序版本2.3:

IMongoCollection<item> col = ...
// create index for parent column
await col.Indexes.CreateOneAsync(Builders<Item>.IndexKeys.Ascending(x => x.ParentId));
var root = await (await col.FindAsync(fdb.Eq(x => x.ParentId, null))).SingleOrDefaultAsync();
var rootComments = await (await col.FindAsync(fdb.Eq(x => x.ParentId, root.Id))).ToListAsync();
// same thing for queries for replies to comments

主要优点是插入。你只需要知道要插入的东西的父元素。没有嵌套查找问题