【问题标题】:Selecting a BsonDocument with its array containing only last N elements using mongodb C# driver使用 mongodb C# 驱动程序选择一个 BsonDocument,其数组仅包含最后 N 个元素
【发布时间】:2016-09-29 00:57:30
【问题描述】:

我在 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' 数组仅包含最后两个元素...我找不到任何解决方案。 ..有人可以建议一种方法吗?

【问题讨论】:

    标签: c# mongodb bson


    【解决方案1】:

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

    从您的 Mongo 集合中选择正确的文档到列表中后 - 这里命名为结果

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

    【讨论】:

    • 是的,但是我必须加载所有消息,然后删除除两条以外的其他消息,对吗?
    • 是的,这样您就可以从数据库中查询所有消息,然后保留您需要的消息
    【解决方案2】:

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

    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")] 属性声明您的实体。

    请让我知道这是否有效。

    【讨论】:

    • 消息数组有很多元素......我只想加载消息数组的最后两个......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多