如何使用官方c#驱动程序从嵌入式数组中选择单个元素.最佳实践

本文关键字:单个 选择 元素 最佳 数组 官方 何使用 驱动程序 嵌入式 | 更新日期: 2023-09-27 18:15:37

给定这个文档形式的课程的集合,我想选择一个来自嵌入数组

的单个参与者对象
{
    _id: someCourseId,
    CourseName: "someName",
    Participants[
        {UserId: X Name: "person1"},
        {UserId:Y, Name:"person2"},
        {UserID:Z, Name:"person3"}
    ]
}

如何用官方的c# sharp驱动程序编写查询返回userID为Y的嵌入数组元素?

现在我可以选择id为Y的参与者的课程使用Query.EQ("Participants.UserId",Y),我可以选择只获取使用的Course对象的Participants字段SetFields("Participants"),但如果这个数组很大,我不想这样做获取整个数组,但只获取一个元素。这可能吗?

如果没有,那么我认为最好不要使用嵌入式数组,在需要获取特定元素的情况下。相反,应该使用一个单独的集合来保存数组值和"根文档的外键"(就像您在RDBMS中所做的那样)。也就是说,在我的示例中,我将创建一个participant集合,其中每个文档保存一个课程的id。你同意吗?

如何使用官方c#驱动程序从嵌入式数组中选择单个元素.最佳实践

你可以这样使用slice:

 // it will skip 0 elements and load only one element from nested array
 var slice = Fields.Slice("Participants", 0, 1); 

另外,我猜你知道mongodb总是返回根文档,但是你可以通过指定你想要加载的字段和嵌套数组的大小来改变这个文档的内容。

使用当前版本的MongoDB是不可能做到这一点的。就像你说的,你必须把它分成两个集合,并有一个引用。由于嵌入式数组的其他限制,例如无法在查询中对它们进行排序,我以前不得不这样做。