我有一个MongoDB数据库,里面有2个集合:programs
和exercises
。 programs
集合中的文档有一个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
那就是为什么我认为我需要一个外部集合。
答案 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)))
此查询的说明:
exercises
的数组(使用MongoDB的$in
运算符)g.exercises
数组的每个元素映射到服务器(res
)中的数组元素,其中ID与请求的相同这是一个请求我需要的所有数据的查询。
希望它会对某人有所帮助。