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