在MongoDB中查询包含多个ObjectIDs的数组

4
我在数据库中有一个"users"集合。一个用户可以是多个团队的成员。
我使用数组来引用团队ID。
{ _id: ObjectId("552544fd600135861d9e47d5)", 
  name : "User1",
  teams: [
        "5527a9493ebbe2452666c238",
        "5527b1be3371e3a827fa602c"
    ]
}

团队不仅仅是一群人的集合:

{ _id: ObjectId("5527a9493ebbe2452666c238"),
  name: "Team 1"
}
{ _id: ObjectId("5527b1be3371e3a827fa602c"),
  name: "Team 2"
}

现在我想获取用户所属的所有团队的名称。
我只找到了这种查询方式:
db.teams.find(
   {_id:{$in:
      [ObjectId("5527a9493ebbe2452666c238"),
      ObjectId("5527b1be3371e3a827fa602c")]
   }})

为了实现这个目标,我需要创建一个专门用于此查询的数组。但我更倾向于避免这样做,因为我已经有了以字符串格式存在的ID数组。类似以下代码会很好:
db.teams.find(
   {_id:{$in:  
          ["5527a9493ebbe2452666c238",
          "5527b1be3371e3a827fa602c"]  // Strings here, not ObjectIDs
   }})

但这并不起作用。是否有一种舒适的方式,可以使用一组字符串ID查询ObjectID?
谢谢和问候 Rolf

嗨@Rolf,你能否解释得更详细一些?我不知道为什么你要检查“teams”集合,而不是直接检查“users”集合中是否存在“teams” ID。 - Neo-coder
我想获取团队的名称(以及一些未在此处说明的元数据)。在用户集合中,我只有TeamIDs可用作对团队集合的引用。 - Rolf Beh
1个回答

8
你可以结合mongodb的findOne()find()游标方法以及本地JavaScript map 方法来获取特定用户的团队ID(这将是一个字符串数组),然后使用map函数将团队字符串ID数组映射到ObjectId数组,并最终使用结果数组作为$in运算符表达式查询团队集合:
var teams = db.users.findOne({"name": "User1"}).teams;
var obj_ids = teams.map(function (item){ return ObjectId(item)});
db.teams.find({ "_id": { "$in": obj_ids } });

输出:

/* 0 */
{
    "_id" : ObjectId("5527a9493ebbe2452666c238"),
    "name" : "Team 1"
}

/* 1 */
{
    "_id" : ObjectId("5527b1be3371e3a827fa602c"),
    "name" : "Team 2"
}

这是一个不错的解决方法!谢谢。到目前为止,我已经“自己”遍历了数组,这基本上只是另一种做法。但我想知道是否有任何原生的MongoDB功能可以帮助我完成这个任务。也许我的数据模型有问题,但我认为在这里使用引用模型是有意义的。 - Rolf Beh

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