正如这篇文章所建议的,我在这里提出我的问题。
我有一个 MongoDB 集合,其中包含代表两个用户之间友谊的文档
{
"_id": "64a337de4538a04610900f0c",
"user1": "6468022102781d442b82afd7",
"user2": "648c7b6b75231cd99e43d7ab",
"areFriends": true
}
我的目标是编写一个聚合函数,给定两个用户的 ID,返回它们的分离度。说得更清楚一点,就像这样:
- 1 = 直接朋友
- 2 = 朋友的朋友
- 3+ 等等
我遇到了上面的 $graphLookup 示例,现在我想知道如何实现类似的东西。
我的情况与另一篇文章的区别在于,我的文档不是单向关系(从-到),而是双向关系(用户 1,用户 2);因此,无法保证想要的用户存储为用户 1 或用户 2。
在我的代码的其他部分,我通过对输入 ID 进行排序或使用如下条件解决了这个问题:
$cond: {
if: { $eq: ['$user1', userId] },
then: '$user2',
else: '$user1',
},
但是,据我了解, $graphLookup中不支持条件(例如connectFromField)
有谁知道如何面对这个特殊问题吗?我将不胜感激。谢谢。
编辑 这是 Ray 提出的聚合管道的修订版本
{ $match: { user1: id1 } },
{
$graphLookup: {
from: 'spots',
startWith: '$user1',
connectFromField: 'user2',
connectToField: 'user1',
as: 'friendshipsViewLookup',
depthField: 'degree',
maxDepth: 2,
},
},
{
$unwind: {
path: '$friendshipsViewLookup',
preserveNullAndEmptyArrays: true,
},
},
{ $match: { 'friendshipsViewLookup.user2': id2 } },
{
$project: {
user1: 1,
user2: '$friendshipsViewLookup.user2',
degree: {
$add: ['$friendshipsViewLookup.degree', 1],
},
},
},
{
$group: {
_id: { user1: '$user1', user2: '$user2' },
minDegree: { $min: '$degree' },
},
},
{
$project: {
user1: '$_id.user1',
user2: '$_id.user2',
degree: '$minDegree',
},
}