在MongoDB文档中过滤数组

4

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

示例数据库文档:

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

期望输出示例:

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

用户3在用户1和用户2的提及列表中都存在,然而用户3是多余的,因为用户3在集合中没有自己的文档。

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

是否有一种简单的方法来使用pymongo做这件事,还是应该创建一个Python解决方案?

1个回答

1
你可以使用 aggregate 在 MongoDB 查询中实现这一点。你可以尝试这个方法。
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"]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接