在MongoDB中查询数组的一个元素和之前的元素

在MongoDB中查询数组的一个元素和之前的元素,mongodb,mongodb-query,Mongodb,Mongodb Query,下面是我的数据示例 { "_id" : ObjectId("5fa7d0e31abef4382b15efd0"), "users" : { "5fa667194f22083924eeca9e" : { "toRead" : 0 },

下面是我的数据示例

{
        "_id" : ObjectId("5fa7d0e31abef4382b15efd0"),
        "users" : {
                "5fa667194f22083924eeca9e" : {
                        "toRead" : 0
                },
                "5fac51148566866156d09d36" : {
                        "toRead" : 1
                }
        },
        "messages" : [
                {
            "messageId": ObjectId("5fa667194f22083924eeca5e"),
                        "userId" : ObjectId("5fa667194f22083924eeca9e"),
                        "message" : "Hello"
                },
                {
            "messageId": ObjectId("5fa667194f22083924eeca6e"),
                        "userId" : ObjectId("5fac51148566866156d09d36"),
                        "message" : "Hi"
                },
                {
            "messageId": ObjectId("5fa667194f22083924eeca7e"),
                        "userId" : ObjectId("5fa667194f22083924eeca9e"),
                        "message" : "How are you ?"
                },
                {
            "messageId": ObjectId("5fa667194f22083924eeca8e"),
                        "userId" : ObjectId("5fac51148566866156d09d36"),
                        "message" : "Fine and you ?"
                },
                {
            "messageId": ObjectId("5fa667194f22083924eeca9f"),
                        "userId" : ObjectId("5fa667194f22083924eeca9e"),
                        "message" : "Fine thanks !"
                },
        ]
}
我想找到数组的元素,在找到的元素之前找到两个元素

例如,如果我正在查找一条消息,其中:

messageId = ObjectId("5fa667194f22083924eeca8e")
messageId=ObjectId(“5fa667194f22083924eeca8e”)

结果应该是一个数组“messages”,其中包含一条消息,其中:

messageId = ObjectId("5fa667194f22083924eeca8e")
在这一条之前还有两条消息。在本例中,它将是:

messageId = ObjectId("5fa667194f22083924eeca7e") 
messageId = ObjectId("5fa667194f22083924eeca6e")
        "messages" : [
                {
            "messageId": ObjectId("5fa667194f22083924eeca6e"),
                        "userId" : ObjectId("5fac51148566866156d09d36"),
                        "message" : "Hi"
                },
                {
            "messageId": ObjectId("5fa667194f22083924eeca7e"),
                        "userId" : ObjectId("5fa667194f22083924eeca9e"),
                        "message" : "How are you ?"
                },
                {
            "messageId": ObjectId("5fa667194f22083924eeca8e"),
                        "userId" : ObjectId("5fac51148566866156d09d36"),
                        "message" : "Fine and you ?"
                }
        ]
因此,结果将是:

messageId = ObjectId("5fa667194f22083924eeca7e") 
messageId = ObjectId("5fa667194f22083924eeca6e")
        "messages" : [
                {
            "messageId": ObjectId("5fa667194f22083924eeca6e"),
                        "userId" : ObjectId("5fac51148566866156d09d36"),
                        "message" : "Hi"
                },
                {
            "messageId": ObjectId("5fa667194f22083924eeca7e"),
                        "userId" : ObjectId("5fa667194f22083924eeca9e"),
                        "message" : "How are you ?"
                },
                {
            "messageId": ObjectId("5fa667194f22083924eeca8e"),
                        "userId" : ObjectId("5fac51148566866156d09d36"),
                        "message" : "Fine and you ?"
                }
        ]
我该怎么做?

  • $unwind
    解构
    消息
    数组
  • $match
    messageId
    小于或等于您的输入
    messageId
  • $sort
    messageId
    降序排列
  • $limit
    3文档
  • $group
    通过
    \u id
    和重构
    消息
    数组

谢谢你来操场玩。我关心的是“$lte”声明。如果ObjectId不是按升序排列的呢?因为时间戳只有4个字节(以秒为单位),所以它是一个随机值。因此,如果同时发送两条消息,数组中较高的一条比第二条具有更高的ObjectId值,这是可能的。但是,当$unwind时,它将保持与messages数组中相同的顺序,我不认为此查询会改变顺序查看中相同的时间戳messageid,但主要关注的是,当消息同时接收时,它将如何插入。我希望查询返回我搜索的消息之前的三条消息,不管之前消息的messageId是什么。例如,在这个操场上,它返回我要查找的消息之后的三条消息,相反。这是因为所有5条消息都具有相同的时间戳,它将如何识别前2条消息?在这种情况下,不可能确定谁是第一位,谁是第二位,如果你知道的话,那就分享吧。在罕见的情况下,很少有2条消息同时插入,因为比较是以毫秒为单位的,所以您应该在插入时维护一些规则,1)新消息推送总是在数组的末尾进行,因此$unwind always保持数组中元素的顺序。我不建议采用这种方式,因为它将选择前两条消息而不查看时间戳。我可以说这是预言。