MongoDb Asp.Core 在关系中定义和使用键(不是值)
MongoDb Asp.Core define and use key (not value) in a relationship
上下文
在我们的应用程序中,我们允许用户上传文件,这些文件将被放入队列中以供审核和批准。
用户的文件 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
}
}
}
}
我的问题
首先,我在用户和文件之间的 link 是否正确:我的意思是 public IList<UserFile> SubmittedFiles { get; set; }
?
如何在现有 users
集合(用户按 Id 过滤)中添加一个文件 ID 作为键,值为 true
.
因此,如何以递归方式检索所有 fileID
,它们是键而不是值,因此我可以使用它们以递归方式检索 state
中相应的 state
=20=] 数据库?
1) 您的 JSON 显然是错误的。例如,如何查看 "users" 集合中的单个用户,注意,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) 如果您想获取所有文件 ID,您可以使用以下查询:
collection.Find(x=>true)
.Project(t=>t.SubmittedFiles.Select(f=>f.fileID))
.ToEnumerable()
.SelectMany(s=>s)
上下文
在我们的应用程序中,我们允许用户上传文件,这些文件将被放入队列中以供审核和批准。
用户的文件 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
}
}
}
}
我的问题
首先,我在用户和文件之间的 link 是否正确:我的意思是
public IList<UserFile> SubmittedFiles { get; set; }
?如何在现有
users
集合(用户按 Id 过滤)中添加一个文件 ID 作为键,值为true
.因此,如何以递归方式检索所有
fileID
,它们是键而不是值,因此我可以使用它们以递归方式检索state
中相应的state
=20=] 数据库?
1) 您的 JSON 显然是错误的。例如,如何查看 "users" 集合中的单个用户,注意,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) 如果您想获取所有文件 ID,您可以使用以下查询:
collection.Find(x=>true)
.Project(t=>t.SubmittedFiles.Select(f=>f.fileID))
.ToEnumerable()
.SelectMany(s=>s)