有没有办法使用MongoDB将_id数组映射到一个查询中的文档?

时间:2016-09-15 12:32:30

标签: mongodb query-optimization nosql

我有一个MongoDB数据库,里面有2个集合:programsexercisesprograms集合中的文档有一个exercises字段,其中包含exercises表中ID的字符串表示形式,如下所示:

{
    "_id" : ObjectId("57da8f955cf29df682932ee9"),
      "exercises" : [ 
          "57da8e01d0649e646afaea4e", 
          "57da8e01d0649e646afaea4e", 
          "57da8e01d0649e646afaea4e"
      ]
}

我需要将这个ID数组映射到相关exercises个对象的数组。问题是,我需要按照精确的顺序,包括重复。就像之前的那个文档一样,它包含3个指向同一exercise的链接,我需要得到一个由3个相同的exercise组成的数组作为响应。

现在我正在使用此查询:

db.collection("exercises").find({_id: {$in: exercises.map(exid => ObjectID(exid)) }}).toArray()

此查询返回我需要的每个exercise,但顺序错误,没有重复。

我可以使用MongoDB在一个查询中实现这样的结果吗?我知道我可以做那样的事情(没有测试它,只是作为一个例子):

exercises.map(exid => db.collection("exercises").find({id: ObjectID(exid)});

像这样的东西应该给我我需要的数组,但我想这不是正确的方法,做一个单独的查询来获得特定的exercise

P.S。我知道我可以将exercises存储在文档中,而不是使用外部exercises集合,但问题是,某些program可能引用相同的exercise那就是为什么我认为我需要一个外部集合。

1 个答案:

答案 0 :(得分:0)

我决定从服务器获取所有exercises的查询,然后将我的所有ID映射到来自服务器的此数组中的值。像那样:

db.collection("exercises")
  .find({_id: {$in: g.exercises.map(exid => ObjectID(exid)) }})
  .toArray()
  .then(res => g.exercises.map(exid => res.find(exs => exs._id == exid)))

此查询的说明:

  • 从服务器获取具有相应ID的所有exercises的数组(使用MongoDB的$in运算符)
  • 将其转换为数组
  • g.exercises数组的每个元素映射到服务器(res)中的数组元素,其中ID与请求的相同

这是一个请求我需要的所有数据的查询。

希望它会对某人有所帮助。