2

我知道,这似乎是一个非常愚蠢的问题。但不管怎么说。

Lats 说,我收集了这种结构的文件:

{
  _id: idvalue, 
  name: namevalue, 
  location: 
  {
    long: longvalue, 
    lat: latvalue
  }
}

当然,还有 C# 中的序列化类。

我需要获取由它的_id 指定的文档的位置。

我试图通过以下方式做到这一点:

var documentLocation = collection.FindOne("_id", new ObjectId(id)).Location;

但在这种情况下,整个文档将取自 db。而且我只想采用json的“位置:{long:longvalue,lat:latvalue}”部分。

我怎样才能做到这一点?

4

2 回答 2

2

您应该使用Find而不是FindOne. FindOne内部调用 Find 方法如下:

return Find(query).SetLimit(1).FirstOrDefault()

这意味着您无法MongoCursor通过FindOne. 但是要指定驱动程序应该返回哪些字段(通过SetFields),您需要访问 mongo 游标。

此外,当您指定字段时,驱动程序仍会返回整个对象(不仅仅是位置),但除指定之外的所有字段都将为空/空。

所以,最后一个查询:

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即使您没有明确指定,驱动程序也将始终返回该字段。

于 2012-06-19T17:10:00.150 回答
1

我认为您可以使用 Cursor 和 Mongo 光标对象上的 setFields 方法来做到这一点。

var cursor = collection.FindAs<DocType>(Query.EQ("_id", new ObjectId(id));
cursor.SetFields(Fields.Include("location");
var items = cursor.ToList();

现在我不能 100% 确定它会完全正确地工作,但它应该在附近。

于 2012-06-19T16:59:03.390 回答