我有一些课程。
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();
有人知道为什么吗?如何使用该元素的索引获取特定的数组元素?
更新
我做了一些实验,并找出以下内容:
如果只需要数组的第一个元素,则以下内容将起作用。
//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();
如果我明确写了一个函数,它将起作用:
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();
答案 0 :(得分:0)
在Mongodb控制台(javaScript)中,您可以使用以下方法实现此目的:
db.foo.find({_id:"1"}).map(function(u){return u.MyList[0].text})
您可以尝试在C#中进行转换,必须有一些功能。