Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb获取聚合框架中的最后一个组合_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Mongodb获取聚合框架中的最后一个组合

Mongodb获取聚合框架中的最后一个组合,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,有一组消息: { "date": NumberLong(1421134514), "sender": "53172480f9cd0e682840b9f7", "recipient": "52f37fbaf9cd0e02773c97b1", "isRead": false, "_id": "54b4cab2f6a48ce34f8b5a75", "text": "Hello!" }, { "date": NumberLong(1421135561), "sender"

有一组消息:

{
  "date": NumberLong(1421134514),
  "sender": "53172480f9cd0e682840b9f7",
  "recipient": "52f37fbaf9cd0e02773c97b1",
  "isRead": false,
  "_id": "54b4cab2f6a48ce34f8b5a75",
  "text": "Hello!"
},
{
  "date": NumberLong(1421135561),
  "sender": "53172480f9cd0e682840b9f7",
  "recipient": "52f37fbaf9cd0e02773c97b1",
  "isRead": false,
  "_id": "54b4cec9f6a48ce34f8b6429",
  "text": "Hello 2!"
},
{
  "date": NumberLong(1421135618),
  "sender": "53072122f9cd0ee76306dc5a",
  "recipient": "52f37fbaf9cd0e02773c97b1",
  "isRead": false,
  "_id": "54b4cf02f6a48ce54f8b62f9",
  "text": "Hello 3!"
},
{
  "date": NumberLong(1421136457),
  "sender": "52f37fbaf9cd0e02773c97b1",
  "recipient": "52ea178ff9cd0e9f24d776b4",
  "isRead": false,
  "_id": "54b4d249f6a48ce54f8b6b9f"
  "text": "Hello 4!"
}
有必要选择后面的对话,其中当前用户是发送者或接收者

例如,对于ID为“52f37fbaf9cd0e02773c97b1”的用户,应获取3条记录

结果是构建了两个独立的查询:

$result = \DB::$connection->message->aggregate(array(
    array('$match' => array('sender' => \Core::getModule('users')->user->_id)),
    array('$group' => array('_id' => '$recipient')),
));

$result2 = \DB::$connection->message->aggregate(array(
    array('$match' => array('recipient' => \Core::getModule('users')->user->_id)), 
    array('$group' => array('_id' => '$sender')),
));
是否可以以某种方式将这两个查询合并为一个查询并按日期对记录进行排序?

这里需要的是为“发件人和收件人”的每个组合生成的“唯一键”值。如果您希望定期执行此操作,那么我建议将值存储在文档中。但这是使用聚合框架解决问题的一种方法:

db.messages.aggregate([
{“$project”:{
“合并”:{“$map”:{
“输入”:{“$literal”:[“A”,“B”]},
“as”:“bin”,
“in”:{“$cond”:[
{“$eq”:[“$$bin”,“A”]},
“$sender”,
“$recipient”
]}
}},
“doc”:“$$ROOT”
}},
{“$unwind”:“$COMPONED”},
{“$sort”:{“_id”:1,“合并”:1,“文件日期”:-1},
{“$组”:{
“\u id”:“$\u id”,
“合并”:{“$push”:“$combined”},
“doc”:{“$first”:“$doc”}
}},
{“$组”:{
“_id”:“$合并”,
“doc”:{“$first”:“$doc”}
}}
])
这将您的示例缩小到“发件人/收件人”上的“唯一”3个组合,并返回该“对”之间对话中的最后一个文档:

{
“_id”:[
“52f37fbaf9cd0e02773c97b1”,
“53172480f9cd0e682840b9f7”
],
“文件”:{
“_id”:“54B4CE9F6A48CE34F8B6429”,
“日期”:长号码(1421135561),
“发件人”:“53172480f9cd0e682840b9f7”,
“收件人”:“52f37fbaf9cd0e02773c97b1”,
“isRead”:错误,
“文本”:“你好2!”
}
}
{
“_id”:[
“52f37fbaf9cd0e02773c97b1”,
“53072122f9cd0ee76306dc5a”
],
“文件”:{
“_id”:“54b4cf02f6a48ce54f8b62f9”,
“日期”:长号码(1421135618),
“发送方”:“53072122f9cd0ee76306dc5a”,
“收件人”:“52f37fbaf9cd0e02773c97b1”,
“isRead”:错误,
“文本”:“你好3!”
}
}
{
“_id”:[
“52ea178ff9cd0e9f24d776b4”,
“52f37fbaf9cd0e02773c97b1”
],
“文件”:{
“_id”:“54b4d249f6a48ce54f8b6b9f”,
“日期”:长号码(1421136457),
“发送方”:“52f37fbaf9cd0e02773c97b1”,
“收件人”:“52ea178ff9cd0e9f24d776b4”,
“isRead”:错误,
“文本”:“你好4!”
}
}

不清楚你在问什么。这两个聚合查询将只返回一个具有单数“\u id”值的元素。你想做什么?用唯一对话者选择此人最后的帖子我需要显示用户参与对话的列表,并按日期对其进行排序。Hmmn。所以说简单的英语,我们不想给人留下深刻印象。您需要由发送者和接收者(两个字段中的值相同)成对进行unqiue转换,然后选择每对之间的最后一条消息。对吗?对不起,我用的是谷歌翻译,我想你理解得对。你需要的是一个“唯一键”值,它为“发送者和接收者”的每个组合生成。如果您希望定期执行此操作,那么我建议将值存储在文档中。我考虑过了,但最终我害怕扩展每个文档16 MB的限制。@jeka5555这里的16 MB限制实际上是关于存储
[“发件人”、“收件人”]
之间的组合数组,以发件人的多少个组合和“排序顺序”组合(因为它们是唯一的)以及可能的“多个”来存储组合数组收件人。数组中有这么多对。这不是我真正回答的(但也不难理解)。我的示例显示了您当前可以执行的“聚合分组”(不更改模式或存储),但仍然可以得到所需的内容。我希望俄语翻译在该内容上足够好。@jeka5555这里要清楚,我不是在为“发送者/接收者”呈现两个
ObjectId
值的“或”组合。我正在介绍所有可能的配对。但你总是可以缩小范围。@jeka5555我想这是一个anwser。我确实证明了这一点。请不要忘记接受你的答案。它帮助每个人,不仅是回答的人,而且也帮助社区,因为有一个明确的被接受的回答。