2017-10-05 5 views
0

Ich habe eine MongoDB-Datenbank namens "Test". In dieser Datenbank habe ich eine Sammlung von Personen in der "People" -Kollektion. Die Menschen Sammlung enthält eine Reihe der folgenden Dokumente:MongoDB Projektion funktioniert in Abfrage, aber nicht beim Erstellen einer Ansicht

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; } 
} 

Da die Adresse Id steigt, wenn Sie eine Adresse zu einer Person hinzufügen, und dass die Adressen werden in chronologischer Reihenfolge hinzugefügt. Ich kann dann den aktuellen Zustand, in dem die Person lebt, mit dem folgenden Abfragecode auslesen.

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(); 

Wenn ich die Ergebnisse durchlaufen ich die folgende Ausgabe: 100, "Sally Parker", "New York" 101, "John Smith", "Nevada" 102, "Fred Jones", "Texas"

Wenn ich versuche, eine Ansicht zu erstellen, die die gleichen Informationen in MongoDB enthält, bekomme ich nicht die gleichen Ergebnisse. Ich weiß, dass ich etwas falsch mache, aber ich kann kein gutes Beispiel dafür finden, was ich tun möchte.

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

Die Ergebnisse, die ich bekomme, sehen so aus.

{ 
    "_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) 

Wer weiß, wie ich einen Blick in den MongoDB erstellen kann, die mir die gleichen Ergebnisse wie das die Abfrage geben?

Antwort

0

mein Problem gefunden. Die tatsächliche Projektion der Daten in meine Klasse geschieht, nachdem die Daten vom Server von der Abfrage gefunden wurden. Da Ansichten buchstäblich nur gelesen werden, haben sie keine Hintergrunddatenobjekte hinter ihnen. Sie verlassen sich auf die Abfrage und die Aggregationspipeline, damit dies korrekt funktioniert. Nachdem ich herausgefunden habe, wie dies zu erreichen ist. Ich habe einen Blogeintrag erstellt, wie ich es gemacht habe.
MongoDB Database Views

Hoffentlich wird dies etwas daran hindern, durch die gleichen Schmerzen zu gehen, die ich gemacht habe.

Verwandte Themen