【问题标题】:Filter array within MongoDB documentMongoDB文档中的过滤器数组
【发布时间】:2017-11-21 01:30:42
【问题描述】:

我正在尝试根据 Twitter 用户提及的内容创建网络地图。我将数据存储在 MongoDB 中,无法弄清楚如何删除不需要的用户。

示例数据库文档:

{
  'user': 'user1'
  'mentioned_users: ['user2', 'user3']
}
{
  'user': 'user2'
  'mentioned_users: ['user1', 'user3']
}

所需输出示例:

{
  'user': 'user1'
  'mentioned_users': ['user2']
}
{
  'user': 'user2'
  'mentioned_users': ['user1']
}

user3 存在于 user1 和 user2 提到的用户列表中,但是 user3 是无关紧要的,因为 user3 在集合中没有自己的文档。

我需要使用 db.collection.find() 或其他方法的过滤器,以便我可以摆脱所有无关用户。

有没有一种简单的方法可以用 pymongo 做到这一点,或者我应该创建一个 python 解决方案?

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    您可以在 MongoDB 查询中使用签名 aggregate 来实现这一点。可以试试这个

    db.users.aggregate([
      {$unwind: "$mentioned_users"},
      {$lookup: {from: "users", localField: "mentioned_users", foreignField: "user", as: "validUser"}},
      {$match: {"validUser.user": {$exists: true}}},
      {
        $group: {
          _id: "$_id",
          user: {$first: "$user"},
          mentioned_users: {$push: "$mentioned_users"}
        }
      }
    ])
    

    然后输出会像

    {
      "_id" : ObjectId("5a13bc87400096bfa0b34228"),
      "user" : "user1",
      "mentioned_users" : ["user2"]
    }
    {
      "_id" : ObjectId("5a13bc87400096bfa0b34229"),
      "user" : "user2",
      "mentioned_users" : ["user1"]
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-29
      • 2018-01-26
      • 2020-04-14
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      • 2019-06-26
      • 2020-09-21
      相关资源
      最近更新 更多