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

时间:2011-11-25 10:54:40

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

鉴于此doc形式,我想选择一个课程集合 嵌入式数组中的单个参与者对象

{
    _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中所做的那样)。 也就是说,在我的例子中,我将创建一个Participants集合,其中 每个doc都拥有课程的ID。你同意吗?

2 个答案:

答案 0 :(得分:1)

您可以像这样使用slice

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

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

答案 1 :(得分:0)

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