MongoDb Asp.Core在关系中定义和使用键(而不是值)

时间:2017-01-05 20:02:05

标签: c# mongodb asp.net-core mongodb-.net-driver

上下文

在我们的应用中,我们允许用户上传文件,这些文件将被放入队列中进行审核和批准。

用户的文件ID将存储为"子列表" (我不知道名字)在用户特定的Mongo数据库中。

问题摘要

我的问题是将文件对象ID定义为我的用户数据库中的密钥,并获取此用户上传的文件ID以检索当前文件state值。

我们的模型

public class User
{
    [BsonId]
    public string Id { get; set; }
    public string email { get; set; } = string.Empty;
    public bool hasAcceptedTerms { get; set; } = false;
    public IList<UserFile> SubmittedFiles { get; set; }
}
public class UserFile
{
    public string fileID { get; set; } // Correspond to the Object Id of a file
    public bool hasFile { get; set; }
}
public class File
{
    [BsonId]
    public string Id { get; set; }
    public string fileServerIdentifier { get; set; } = string.Empty;
    public string filename { get; set; } = string.Empty;
    public string user { get; set; } = string.Empty; //Corresponds to the user object Id
    public int state { get; set; } = 0;
}

Mongo JSON数据库示例

{
  "files" : {
    "5349b4ddd2781d08c09890f3" : {
      "fileServerIdentifier" : "7e1fed29-c3b2-4d7e-9e00-bbff38aecb51",
      "filename" : "document.pdf",
      "user" : "507f1f77bcf86cd799439011",
      "state": 0
    }
  },
  "users" : {
    "507f1f77bcf86cd799439011" : {
      "email" : "username@domain.com",
      "hasAcceptedTerms" : true,
      "submitted-files" : {
        "5349b4ddd2781d08c09890f3" : true
      }
    }
  }
}

我的问题

  1. 首先,我的用户和文件之间的链接是否正确:我的意思是public IList<UserFile> SubmittedFiles { get; set; }

  2. 如何在现有users集合(按ID过滤的用户)中添加值为true的fileID 作为键

  3. 作为一个结果,如何递归检索所有fileID哪些是键而不是值,以便我可以使用它们递归检索state中相应的File数据库?

1 个答案:

答案 0 :(得分:1)

1)你的JSON是错误的。从示例中,如何看待“用户”集合中的单个用户,注意,SubmittedFiles是一个数组:

{
   "_id":"5349b4ddd2781d08c09890f3",
   "email":"email@email.com",
   "hasAcceptedTerms":true,
   "SubmittedFiles":[
      {
         "fileID":"5349b4ddd2781d08c09890f3",
         "hasFile":true
      }
   ]
}

2)可以在服务器上更改数组的这一个值,但我不确定,我可以编写这个mongo查询。我建议从集合中获取User,更改值并写回用户:

var userLoaded = collection.Find(x=>x.Id =="586f92559afc29759076efd8").Single();
userLoaded.SubmittedFiles.First(x=>x.fileID=="5349b4ddd2781d08c09890f3").hasFile = true;
collection.ReplaceOne(u=>u.Id==userLoaded.Id,  userLoaded);

3)如果你想获取所有fileIds,你可以使用这个查询:

collection.Find(x=>true)
           .Project(t=>t.SubmittedFiles.Select(f=>f.fileID))
           .ToEnumerable()
           .SelectMany(s=>s)