【问题标题】:How to get first item from a grouped array in mongodb如何从mongodb中的分组数组中获取第一项
【发布时间】:2017-10-27 12:39:48
【问题描述】:

我有一个查询,它在 shell 中完美运行

db.getCollection('chatmessages').aggregate(
[
    { 
        $match : { 
            ChatId: { $in : [ObjectId("59edf7d34330cf25d6acd3fb")] }
        },
    },
    { 
        $group : { 
            _id : { ChatId : "$ChatId" },
            LastMessage : { $first : "$$CURRENT"}
        }
    }
])

但是当我试图让它像这样在 c# 中工作时:

        var list = await _mongoCollection.Aggregate()
            .Match(mes => chatIdsObject.Contains(mes.ChatId))
            .SortBy(mes => mes.ChatId)
            .ThenByDescending(mes => mes.CreateDateTime)
            .Group(
                key => key.ChatId,
                group => new
                {
                    ChatId = group.Key,
                    LastMessage = group.Select(x => x).First()
                })
            .ToListAsync();

我收到一个错误:

$project 或 $group 不支持 {document}。

有没有办法让 $first 与 $$CURRENT 合作在 C# 中工作?

【问题讨论】:

标签: c# mongodb


【解决方案1】:

另一种方法是将 json 注入管道中:

var list = await _mongoCollection.Aggregate()
    .Match(mes => chatIdsObject.Contains(mes.ChatId))
    .SortBy(mes => mes.ChatId)
    .ThenByDescending(mes => mes.CreateDateTime)
    .Group(new JsonProjectionDefinition<ChatMessages>(@"{ 
        '_id' : { 'ChatId' : '$ChatId' },
        'LastMessage' : { '$first' : '$$CURRENT' }
    }"))
    .ToListAsync();

【讨论】:

  • BsonDocument 也可以工作:new BsonDocument { { "_id", "$ChatId" }, { "LastMessage", new BsonDocument { { "$first", "$$CURRENT" } } } }
  • 谢谢。经过一些变通方法后将结果转换为强类型对象。
猜你喜欢
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
相关资源
最近更新 更多