node.js - 查找未邀请任何用户的用户

我想通过单个查询(使用聚合)找到那些没有邀请任何用户的用户。

例如:我在数据库中有 4 个用户

{
    "_id" : ObjectId("581a18d41b6c5c752f11c87a"),
    "name": "aaa",
    "invitedBy": ObjectId("5808f53d28c14ee470856d8b")
},

{
    "_id" : ObjectId("581a1a671b6c5c752f11c87b"),
    "name": "bbb",
    "invitedBy": ObjectId("581a18d41b6c5c752f11c87a")
},

{
    "_id" : ObjectId("581a1a671b6c5c752f11c87c"),
    "name": "ccc",
    "invitedBy": ObjectId("581a18d41b6c5c752f11c87a"),
},

{
    "_id" : ObjectId("581a1a671b6c5c752f11c87d"),
    "name": "ddd",
    "invitedBy": ObjectId("581a1a671b6c5c752f11c87b"),
}

这里

1- aaa invited bbb and ccc user

2- bbb invited ddd user

3- but ccc and ddd user not invited any one

所以我想给 cccddd 用户拍照

如果可以使用聚合会更好,因为我需要对选定的数据执行一些操作。

最佳答案

您可以使用 $lookup运算符对集合本身执行左连接。

没有发送任何邀请的用户是那些邀请数组为空的用户。要仅检索这些用户,只需过滤 $match 中的文档即可。舞台使用$exists运算符和数字数组索引。

db.users.aggregate(
    [
        { "$lookup": { 
            "from": "users", 
            "localField": "_id", 
            "foreignField": "invitedBy", 
            "as": "invitation"
        }}, 
        { "$match": { "invitation.0": { "$exists": false } } }
    ]
)

产生:

{
    "_id" : ObjectId("581a1a671b6c5c752f11c87c"),
    "name" : "ccc",
    "invitedBy" : ObjectId("581a18d41b6c5c752f11c87a"),
    "invitation" : [ ]
}
{
    "_id" : ObjectId("581a1a671b6c5c752f11c87d"),
    "name" : "ddd",
    "invitedBy" : ObjectId("581a1a671b6c5c752f11c87b"),
    "invitation" : [ ]
}

https://stackoverflow.com/questions/40626075/

相关文章:

ruby-on-rails - 在 Rails 控制台中列出所有 Mongoid 模型

node.js - Mongoose 在未指定的时间段后停止响应

node.js - Nodejs 我需要使用 Passport

java - 如何防止连接池在 mongodb 上使用 java 驱动程序关闭?

node.js - Node/Express - 保护客户端/服务器之间通信的好方法

mongodb - Meteor 1.4.1.1 上副本集的正确 MONGO_URL 设置是什么

node.js - 如何使用 MongoDB 按名字和姓氏搜索用户?

mongodb - 使用 mongoose 正则表达式与文本在 mongodb 中搜索

node.js - 我可以在 MongoDB 的聚合查询中申请 forEach 吗?

mongodb - 使用键值对将 mongo 数组转换为对象