【问题标题】:MongoDB: Querying collection and filtering by array in another collectionMongoDB:查询集合并按另一个集合中的数组过滤
【发布时间】:2020-11-05 17:51:01
【问题描述】:

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

    { 
        "_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 是用户文档的外键。

我,作为用户 (Ex _id : 20) 我正在执行查询。我想查询用户集合并查找具有某些字段(城市、姓名等)的用户,以及在他的记录数组中不包含我的任何注册表(用户 _id:20)的用户。

知道怎么做吗?我曾尝试使用 $lookup 和其他运算符,但没有运气。 提前致谢

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 你好@Valijon。是的,或多或少是想法,但有一个细节。我想检查记录数组中不存在某个用户(通过参数传递,通过_id),而不是查找的当前用户。因此,如果该特定用户在数组中不存在并且匹配字段正确,那么我返回当前用户。可能我在问题中没有正确解释自己。
    • @carrasc0 如果你用例子解释这个细节会很好,因为the current user doesn't exist there我已经解释为过滤用户
    • 没问题。情况就是这样:我,作为用户 20 我正在执行查询。我想查询用户集合并查找具有某些字段(城市、姓名等)的用户,以及在他的记录数组中不包含我的任何注册表(用户 20)的用户。当我说“当前用户”时,我指的是执行查询的那个人,即我需要检查的那个人在过滤用户的记录数组中不存在。我为糟糕的解释道歉。
    • @carrasc0 请编辑您的帖子
    猜你喜欢
    • 2022-01-09
    • 2014-11-27
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    相关资源
    最近更新 更多