"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でビューを作成してクエリと同じ結果を得る方法を知っている人はいますか?