我有两个集合,用户和用户活动记录。 我的用户集合很简单:
{
"_id" : ObjectId("5f0b29c78f491172cfe8b049"),
"created" : ISODate("2020-07-12T15:18:31.319+0000"),
"lastLogin" : ISODate("2020-07-12T15:18:31.319+0000"),
"name" : {
"first" : "Pedro",
"last" : "Perez"
},
"city" : "New York"
}
记录集:
{
"_id" : ObjectId("5f0fb901b320f5ec21269279"),
"userId" : ObjectId("5f0b29c78f491172cfe8b04a"),
"record" : [
{
"user" : ObjectId("5f0b29c78f491172cfe8b049"),
"name" : "Pedro",
"type" : "like"
},
{
"user" : ObjectId("5f0b29c78f491172cfe8b04b"),
"name" : "Rivaldo",
"type" : "fold"
}
]
}
在这种情况下,userId是用户文档的外键。
我,作为用户(例如_id:20)正在执行查询。我想查询用户集合并查找具有某些字段(城市,姓名等)的用户,并且还要在他的记录数组中不包含我的任何注册表(用户_id:20)。
任何想法怎么做?我曾尝试与$ lookup和其他运算符,但没有运气。 预先感谢
答案 0 :(得分:1)
如果您需要检查records
字段中是否不存在任何过滤的用户,则可以执行以下简单聚合:
db.users.aggregate([
{
$match: {
"name.last": "Perez"
}
},
{
$lookup: {
from: "articles",
localField: "_id",
foreignField: "records.user",
as: "users"
}
},
{
$match: {
users: {
$size: 0
}
}
}
//Remove extra field
//,{
// $unset: "users"
//}
])