我知道这似乎是一个非常愚蠢的问题。但无论如何。
Lats说,我收集了这种结构的文件:
{
_id: idvalue,
name: namevalue,
location:
{
long: longvalue,
lat: latvalue
}
}
当然,还有C#中的序列化类。
我需要获取由_id指定的文档的位置。
我试图通过以下方式做到这一点:
var documentLocation = collection.FindOne("_id", new ObjectId(id)).Location;
但在这种情况下,整个文档将从db中获取。我只想把“位置:{long:longvalue,lat:latvalue}”作为json的一部分。
我该怎么做?
答案 0 :(得分:2)
您应该使用Find
代替FindOne
。 FindOne
内部调用Find方法如下:
return Find(query).SetLimit(1).FirstOrDefault()
这意味着您无法通过MongoCursor
更改FindOne
。但要指定驱动程序应返回的字段(通过SetFields
),您需要访问mongo游标。
此外,当您指定字段时,驱动程序仍会返回整个对象(不仅仅是位置),但除指定之外的所有字段都将为null / empty。
所以,最后一个问题是:
var documentLocation = collection.Find("_id", new ObjectId(id))
.SetFields(Fields.Include("Location"))
// single if you sure that this document always in db
.Single()
.Location;
即使您没有明确指定,驱动程序也会始终返回_id
字段。
答案 1 :(得分:1)
我认为你可以使用Gersor和Mongo游标对象上的setFields方法来做到这一点。
var cursor = collection.FindAs<DocType>(Query.EQ("_id", new ObjectId(id));
cursor.SetFields(Fields.Include("location");
var items = cursor.ToList();
现在我不是百分百肯定会完全正确地工作,但它应该在附近。