2

それは本当にばかげた質問のようです、私は知っています。とにかく。

広背筋は、私はそのような構造の文書のコレクションを持っていると言います:

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

そしてもちろん、C#のシリアル化されたクラス。

_idで指定されたドキュメントの場所を取得する必要があります。

私はこれを次のようにしようとしました:

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

ただし、この場合、ドキュメント全体がdbから取得されます。そして、jsonの「location:{long:longvalue、lat:latvalue}」の部分だけを取得したいと思います。

どうやってやるの?

4

2 に答える 2

2

Findの代わりに使用する必要がありFindOneます。FindOne次のように、Findメソッドを内部的に呼び出します。

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

つまり、をMongoCursor介して変更することはできませんFindOne。ただし、ドライバーが(を介してSetFields)返すフィールドを指定するには、mongoカーソルにアクセスする必要があります。

また、フィールドを指定すると、ドライバーはオブジェクト全体(場所だけでなく)を返しますが、指定されたものを除くすべてのフィールドはnull/空になります。

したがって、最後のクエリ:

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

これは、MongoカーソルオブジェクトのCursorメソッドと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 に答える