我正在研究Node.js + mongodb应用程序,我的问题与我的数据库和查询的设计有关。首先,描述我的数据库结构。我在我的数据库中有两个集合用户和值。用户集合中的文档如下所示:
{
"_id" : 31450861,
"first_name" : "Jon",
"last_name" : "Doe",
"sex" : 2,
"bdate" : ISODate("1981-08-01T21:00:00Z"),
"city" : {
"id" : 282,
"title" : "Minsk"
},
"country" : {
"id" : 3,
"title" : "Belarussia"
},
"photo_max" : "https://foto.ru/RnhOKp2YJE4.jpg",
"relation" : 4,
"interests" : "science",
"music" : "pop",
"lang" : "RU",
}
此集合中包含用户数据(语言,生日等)。 集合值中的文档如下所示:
{
"_id" : ObjectId("548023e5c16f310c23b75075"),
"userId" : "31450861", //reference to _id in users collection
"group1" : {
"value1" : 13,
" value2" : 7,
" value3" : 3,
" value4" : 14,
" value5" : 17
},
"group2" : {
" value1" : 9,
" value2" : 6,
" value3" : 17,
" value4" : 12,
" value5" : 13
}
所以我需要在这个数据库中搜索用户,其中包含来自这两个集合的大量参数(他们的值(来自集合值),性别,城市,语言等)。我没有将文档值嵌入到用户中,因为我对它们分别进行了大量查询(但可能是错误的设计,我需要帮助)。将来会有更多具有相似结构的集合,比如值(或者至少会引用userId),我必须将其包含在搜索查询中,并且我需要灵活性来扩展我对更多集合的查询。 所以我需要对这个集合运行复杂的查询(我知道mongodb中没有JOIN,所以我知道我必须查询两次或使用mapreduce)。
到目前为止,我对这个问题的看法(未在代码中测试过。)
我需要编写执行2个查询的搜索功能(以后会更多):
查找具有相同值并获取其ID的用户。
var values = db.collection('values'); var ids = values.find({value1:1,value2:2,value3:3},{userId:1})//然后转换ids,使其成为带有userId的数组
然后在这个找到的集合中找到更多参数(性别,生日,语言等)的用户
var users = db.collection('users'); users.find({$ and:[{_id:{$ in:ids}},{sex:2},{lang:“RU”}]});
我的问题是: 1.这是正常的方法还是在添加新的集合和查询时,我最终会遇到性能非常慢和代码混乱的问题? 2.如果是正常的,如何轻松地再向一个集合添加一个查询? 任何帮助,欢迎任何想法!提前谢谢!