如何在不获取整个文档的情况下获得字段值?

时间:2012-06-19 16:42:29

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

我知道这似乎是一个非常愚蠢的问题。但无论如何。

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的一部分。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

您应该使用Find代替FindOneFindOne内部调用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();

现在我不是百分百肯定会完全正确地工作,但它应该在附近。