node.js - 获取具有关注者和关注者的相互列表
问题描述
我有一些模式名称follower
,其中user
字段包含正在遵循的值,并且是follower
在上面遵循的人user
。我想要关注并同时被同一个人关注的用户列表。下面是集合follower
。我需要这些条目"user" : ObjectId("5e09e4ab35f4a75e8d8536a9"), "follower" : ObjectId("5e15a8763a8ec3019f6f9652"),
,"user" : ObjectId("5e15a8763a8ec3019f6f9652"), "follower" : ObjectId("5e09e4ab35f4a75e8d8536a9"),
因为它们都互相关注。
/* 1 */
{
"_id" : ObjectId("5e15c0c03a8ec3019f6f96c4"),
"createdAt" : "1578395182056",
"user" : ObjectId("5e09e4ab35f4a75e8d8536a9"),
"follower" : ObjectId("5e15a8763a8ec3019f6f9652"),
"__v" : 0
}
/* 2 */
{
"_id" : ObjectId("5e1700852ad51f163b434d23"),
"createdAt" : "1578495739228",
"user" : ObjectId("5e15a8763a8ec3019f6f9652"),
"follower" : ObjectId("5e16f8892ad51f163b434ca6"),
"__v" : 0
}
/* 3 */
{
"_id" : ObjectId("5e1c82222ad51f163b434db1"),
"createdAt" : "1578495739228",
"user" : ObjectId("5e09e4ab35f4a75e8d8536a9"),
"follower" : ObjectId("5e1c780c2ad51f163b434dae"),
"__v" : 0
}
/* 4 */
{
"_id" : ObjectId("5e21da4004925e327f6971f6"),
"createdAt" : "1579257833519",
"user" : ObjectId("5e09e4ab35f4a75e8d8536a9"),
"follower" : ObjectId("5e21967f04925e327f6971a0"),
"__v" : 0
}
/* 5 */
{
"_id" : ObjectId("5e22b8ddc30a562d3b3238e8"),
"createdAt" : "1579328869333",
"user" : ObjectId("5e21967f04925e327f6971a0"),
"follower" : ObjectId("5e09e4ab35f4a75e8d8536a9"),
"__v" : 0
}
/* 6 */
{
"_id" : ObjectId("5e22babfc30a562d3b3238ec"),
"createdAt" : "1579328869333",
"user" : ObjectId("5e09fbd035f4a75e8d8536c1"),
"follower" : ObjectId("5e09e4ab35f4a75e8d8536a9"),
"__v" : 0
}
/* 7 */
{
"_id" : ObjectId("5e26b580630be3588b5ed152"),
"createdAt" : "1579594730310",
"user" : ObjectId("5e09e76035f4a75e8d8536ae"),
"follower" : ObjectId("5e09e4ab35f4a75e8d8536a9"),
"__v" : 0
}
/* 8 */
{
"_id" : ObjectId("5e27101527bb4366a8ee5d54"),
"createdAt" : "1579614413346",
"user" : ObjectId("5e09e7d335f4a75e8d8536af"),
"follower" : ObjectId("5e09e4ab35f4a75e8d8536a9"),
"__v" : 0
}
解决方案
您可以使用以下管道:
db.collection.aggregate(
[
{
"$lookup": {
"from": "followers", //this is the current collection, I didn't know what's the name
"let": {
"currUser": "$user",
"currFollower": "$follower"
},
"pipeline": [
{
"$match": {
"$expr": {
"$and": [
{
"$eq": [
"$user",
"$$currFollower"
]
},
{
"$eq": [
"$follower",
"$$currUser"
]
}
]
}
}
}
],
"as": "matched"
}
},
{
"$match": {
"matched.0": {
"$exists": true
}
}
},
{
"$group": {
"_id": null,
"usersThatFollowEachOther": {"$addToSet": "$follower"}
}
}
]
);
推荐阅读
- javascript - 无法从表单访问这两个文件
- android - 如何在现实世界中的小图像上添加 ar 对象
- ag-grid - 树数据:可以使用列组定义作为 autoGroupColumnDef
- python - Python:按非字典顺序对字符串进行排序
- c# - 为什么我的任务不能多次取消和重新创建?
- angular - 无法从 api 显示特定项目的 Json
- oracle - Oracle 客户端和 ODP.NET 版本兼容性
- python - 如何通过明智地选择项目索引从 2 个列表中创建子列表
- reactjs - 打字稿中的React-破坏状态错误
- python - autoreload 模块不是 IPython 扩展