2016-09-27 4 views
0

Ich habe eine Sammlung in MongoDB mit BsonDocuments wie dieseAuswählen eines BsonDocument mit seiner Reihe nur letzten N Elemente mit mongodb C# Treiber

messages: [ 
{ 
time: "0001-01-01T00:00:00Z", 
room: "ROOM2", 
receiver: "[email protected]", 
receiverName: "xxxxxxxxx", 
sender: "[email protected]", 
senderName: "xxxxxxxxx", 
message_text: "jl,hrdls" 
}, 
{ 
time: "0001-01-01T00:00:00Z", 
room: "ROOM2", 
receiver: "[email protected]", 
receiverName: "xxxxxxxxx", 
sender: "[email protected]", 
senderName: "xxxxxxxxx", 
message_text: "hello world" 
}, 
{ 
time: "0001-01-01T00:00:00Z", 
room: "ROOM2", 
receiver: "[email protected]", 
receiverName: "XXXXXXXXX", 
sender: "[email protected]", 
senderName: "XXXXX", 
message_text: "hello world" 
} 
], 
_id: 4, 
email1: "[email protected]", 
email2: "[email protected]" 

jetzt mit C# Treiber für MongoDB I enthalten, dass diese Dokumente so wählen wollen, dass die 'Nachrichten' Array enthält nur die letzten zwei Elemente ... Ich kann keine Lösung finden ... kann jemand bitte einen Weg vorschlagen?

Antwort

0

wenn Sie glücklich mit diesem Problem zu umgehen:

nach den richtigen Dokumenten aus Ihrer Mongo Sammlung in eine Liste auswählen - hier genanntes Ergebnis

var filter = Builders<Entity>.Filter.Eq("email1", "[email protected]"); 
    List<Entity> result = await msgs.Find(filter).ToListAsync(); 

Sie könnten Schleife durch das Ergebnis und halten Sie die erste nur zwei Nachrichteneinträge:

foreach (Entity item in result) 
      { 
       item.messages = item.messages.OrderByDescending(p => p.time).Take(2).ToList(); 
      } 

wo Entity ist eine Art Modell darstellt. Etwas wie:

class Entity 
    { 
     public BsonObjectId _id { get; set; } 
     public string email1 { get; set; } 
     public string email2 { get; set; } 
     public List<Message> messages { get; set; } 

     public Entity() 
     { 
      messages = new List<Message>(); 
     } 
    } 

    class Message 
    { 
     public DateTime time { get; set; } 
     public string room { get; set; } 
     //... 
     public string message_text { get; set; } 
    } 
+0

ja aber dann muss ich alle Nachrichten laden dann andere außer den beiden rechts entfernen? –

+0

ja, auf diese Weise fragen Sie alle Nachrichten aus Ihrer Datenbank, und dann behalten Sie die, die Sie brauchen – tretom

0

Sie benötigen einen Vorsprung wie dies zu tun, nur die Felder enthalten, die Sie wollen:

var query = collection.Find(filter). // your filter 
       Project<Document>(
       Builders<Document>.Projection 
           .Include("messages.senderName") 
           .Include("messages.message_text") 
           .Include("email1") 
           .Include("email2") 
); 

Dazu Ich glaube, Sie müssen Ihr Unternehmen mit der erklärt haben [BsonElement ("Nachrichten")] Attribut.

Bitte lassen Sie mich wissen, wenn dies funktionierte.

+0

das Nachrichtenarray hat eine Reihe von Elementen .... Ich möchte nur die letzten beiden der Nachricht Array laden ... –

Verwandte Themen