使用Proo of MongoDB .Net Driver获取特定的数组元素

时间:2017-12-03 12:55:16

标签: .net mongodb projection

我有一些课程。

public class MyClass
{
  public string Id {get;set;}
  public List<MyElement> MyList {get;set;} = new List<MyElement>();

  //Other extra fields
}
public class MyElement
{
  public string Text {get;set;}
  public string AnotherField {get;set;}
}

以下是我的MyClass示例文档:

{
  "_id": "1",
  "MyList": [{
    "text":"Element 0"
  },{
    "text":"Element 1"
  }]
}

现在我只想检索元素0.我使用Projection编写了以下代码:

Expression<Func<MyClass, MyElement>> getElementZero = (c => c.MyList[0]);
Expression<Func<MyClass, List<MyElement>>> getList = (c => c.MyList);
FilterDefinition<MyClass> filter = Builders<MyClass>.Filter.Eq(p => p.Id, "1");
//This is good
List<MyElement> myList = mongoCollection.Find(filter).Project(getList).First();

//However, myElement is null after this projection
MyElement myElement = mongoCollection.Find(filter).Project(getElementZero).First();

有人知道为什么吗?如何使用该元素的索引获取特定的数组元素?

更新

我做了一些实验,并找出以下内容:

  1. 如果只需要数组的第一个元素,则以下内容将起作用。

    //this will work
    MyElement myElement = mongoCollection.Find(filter).Project(c => c.MyList.First()).First();
    //this is not going to work
    MyElement myElement = mongoCollection.Find(filter).Project(c => c.MyList.GetElementAt(0)).First();
    
  2. 如果我明确写了一个函数,它将起作用:

    public MyElement GetElementAt(MyClass c, int index)
    {
      return c.MyList[index];
    }
    //this will work
    MyElement myElement = mongoCollection.Find(filter).Project(c => GetElementAt(c, someIndex)).First();
    

1 个答案:

答案 0 :(得分:0)

在Mongodb控制台(javaScript)中,您可以使用以下方法实现此目的:

db.foo.find({_id:"1"}).map(function(u){return u.MyList[0].text})

您可以尝试在C#中进行转换,必须有一些功能。