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

mi7gmzs6  于 2022-12-03  发布在  Go
关注(0)|答案(2)|浏览(165)

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

{ 
        "_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是用户文档的外键。
I,作为用户(Ex _id:20)我正在执行查询。我想查询用户集合并查找具有某些字段(城市、姓名等)的用户,以及不包含我的任何注册表的用户(user _id:20)在他的记录数组中。
知道怎么做吗?我试过用$lookup和其他操作符,但没有运气。提前感谢

z5btuh9x

z5btuh9x1#

如果需要检查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

rsaldnfx

rsaldnfx2#

首先,创建一个容易读取的外键,这样即使你复制粘贴它,也不会很难。
数据库.用户.聚合([{$lookup:{从:“记录”,本地字段:“_id”,外部字段:“用户ID”,作为:“用户”}}])
函数将对此起作用。您似乎没有注意到记录集合的“userId”与用户集合的“_id”字段不匹配。
查看您的ID(_I):对象ID(“5 f0 b29 c78 f491172 cfe 8b 049”)
查看您的用户ID:对象ID(“5 f0 b29 c78 f491172 cfe 8b 04 a”)
我希望你注意到049已经被04 a取代了
检查一下,你会找到你的答案:)

相关问题