2017-10-05 11 views
0

"Test"というMongoDBデータベースがあります。このデータベースでは、私は人のコレクションに人のコレクションを持っています。住所は、Idはあなたが人にアドレスを追加するときに増加し、アドレスが年代順に追加されていることをことを考えるMongoDB Projectionはクエリで機能しますが、ビューを作成するときには機能しません

class Person{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public Address[] Addresses { get; set; } 
} 

class Address { 
    public int Id { get; set; } 
    public string Street { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string Zip { get; set; } 
} 

:人々のコレクションは、次の書類の配列が含まれています。その人が次のクエリコードを使用している現状を投影することができます。

class CurrentAddressView { 
    public int PersonId { get; set; }, 
    public string Name { get; set; }, 
    public string CurrentState { get; set; } 
} 

var mongoConnectionString = @"mongodb://localhost"; 
var db = (new MongoDB.Driver.MongoClient(mongoConnectionString)).GetDatabase("Test"); 
var collection = db.GetCollection<Person>("People"); 

var filter = Builders<Person>.Filter.Empty; 
var projection = Builders<Person>.Projection.Expression(m => new CurrentAddressView 
{ 
    PersonId = m.Id, 
    Name = m.Name, 
    CurrentState = m.Addresses.OrderBy(m => m.Id).Last().State 
}); 

var options = new FindOptions<Person, CurrentAddressView> { Projection = projection }; 
var results = collection.FindAsync(filter, options).Result.ToList(); 

私は結果を反復処理するとき、私は次のような出力を得る: 100を、「サリー・パーカー」、「ニューヨーク」 101、「ジョン・スミス」、「ネバダ」 102、「フレッド・ジョーンズ」、 "Texas"

MongoDBで同じ情報を含むビューを作成しようとすると、私は同じ結果を得ません。私は何か間違っていることを知っていますが、私がしたいことをする良い例は見つけられません。

var pipeline = new[] { 
    PipelineStageDefinitionBuilder.Project<Person, CurrentAddressView>(projection) 
}; 
db.CreateView<Person, CurrentAddressView>("MySpecialView", "People", pipeline); 

結果は次のようになります。

{ 
    "_id" : NumberInt(100), 
    "Name" : "Sally Parker", 
    "Addresses" : [ 
    { 
     "_id": NumberInt(1), 
     "Street": "First Street", 
     "City": "First Town", 
     "State": "Pennsylvania", 
     "Zip": "19200" 
    }, 
    { 
     "_id": NumberInt(1), 
     "Street": "Second Street", 
     "City": "Second Town", 
     "State": "New York", 
     "Zip": "19300" 
    } 
... (more results) 

MongoDBでビューを作成してクエリと同じ結果を得る方法を知っている人はいますか?

答えて

0

私の問題が見つかりました。私のクラスへの実際のデータ投影は、サーバからのデータがクエリによって見つけられた後に起こります。ビューは文字通り読み込み専用なので、後ろにバッキングデータオブジェクトはありません。これが正しく動作するためには、クエリと集約パイプラインに依存します。私はこれを達成する方法を考え出した後。私はそれをどうやって行ったのかに関するブログ投稿を作成しました。
MongoDB Database Views

これが、私が行ったのと同じ痛みを経験しないようにしてください。

関連する問題