MongoDB:查询集合并按另一个集合中的数组进行过滤

时间:2020-07-16 05:47:50

标签: mongodb collections mongodb-query aggregation-framework lookup

我有两个集合,用户和用户活动记录。 我的用户集合很简单:

    { 
        "_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和其他运算符,但没有运气。 预先感谢

1 个答案:

答案 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"
  //}
])

MongoPlayground