繁体   English   中英

使用mongodb C#驱动程序选择一个BsonDocument及其数组仅包含最后N个元素

[英]Selecting a BsonDocument with its array containing only last N elements using mongodb C# driver

我在MongoDB中有一个像这样的BsonDocuments的集合

messages: [
{
time: "0001-01-01T00:00:00Z",
room: "ROOM2",
receiver: "xxxxxxxxx@xxx.xxx",
receiverName: "xxxxxxxxx",
sender: "xxxxxxxxx@xxx.xxx",
senderName: "xxxxxxxxx",
message_text: "jl,hrdls"
},
{
time: "0001-01-01T00:00:00Z",
room: "ROOM2",
receiver: "xxxxxxxxx@xxx.xxx",
receiverName: "xxxxxxxxx",
sender: "xxxxxxxxx@xxx.xxx",
senderName: "xxxxxxxxx",
message_text: "hello world"
},
{
time: "0001-01-01T00:00:00Z",
room: "ROOM2",
receiver: "xxxxxxxxx@xxx.xxx",
receiverName: "XXXXXXXXX",
sender: "XXXXXXXX@xxx.xxx",
senderName: "XXXXX",
message_text: "hello world"
}
],
_id: 4,
email1: "xxxx@XXX.xxx",
email2: "xxxxxx@xxx.xxx"

现在为MongoDB使用C#驱动程序,我要选择这些文档,以使'messages'数组仅包含最后两个元素...我找不到任何解决方案...有人可以建议一种方法吗?

如果您对解决方法感到满意:

从您的Mongo集合中选择正确的文档并放入列表后-此处命名为result

    var filter = Builders<Entity>.Filter.Eq("email1", "email@one.net");
    List<Entity> result = await msgs.Find(filter).ToListAsync();

您可以遍历结果并仅保留前两个消息条目:

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

其中Entity是代表模型的类型。 就像是:

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

您需要进行这样的投影,以仅包含所需的字段:

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

为此,我认为您需要使用[BsonElement(“ messages”)]属性声明您的实体。

请让我知道是否可行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM