MongoDB / NodeJS查询从字典中获取数据

时间:2014-07-31 07:50:56

标签: javascript node.js mongodb nosql

嗨,在mongo DB中,我有一个像这样的表“游戏”:

{
"_id" : ObjectId("53c66f922e15c4e5ee2655af"),
"name" : "alien-kindergarden",
"title" : "Alien Kindergarden",
"description" : "Alien description",
"gameCategory_id" : "1",
"deviceOrientation_id" : "1",
"position" : "1"
}

我有一些词典(也是MongoDB中的简单集合),例如“gameCategory”:

{
    "_id" : 0,
    "name" : "GAME_CATEGORY_NO_CATEGORY"
}

{
    "_id" : 1,
    "name" : "GAME_CATEGORY_POPULAR"
}

如何使用我的词典中的字段从集合“游戏”中获取数据,如:

 {
    "_id" : ObjectId("53c66f922e15c4e5ee2655af"),
    "name" : "alien-kindergarden",
    "title" : "Alien Kindergarden",
    "description" : "Alien description",
    "gameCategory" : GAME_CATEGORY_NO_CATEGORY, <---------------
    "deviceOrientation_id" : "1",
    "position" : "1"
    }

感谢。我正在使用Node服务器。

1 个答案:

答案 0 :(得分:1)

你基本上要求的是SQL中的“JOIN”。你的第一个阅读点应该是MongoDB does not do joins。这里的一般概念是“嵌入”,其中相关信息实际上包含在文档中。

正确阅读官方文件的Data Modelling部分可以涵盖各种方面,例如此方法和替代方法。但在大多数情况下,您希望引用的数据应该只是原始文档的一部分:

{
    "_id" : ObjectId("53c66f922e15c4e5ee2655af"),
    "name" : "alien-kindergarden",
    "title" : "Alien Kindergarden",
    "description" : "Alien description",
    "gameCategory" : "GAME_CATEGORY_POPULAR",
    "deviceOrientation_id" : "1",
    "position" : "1"
}

这通常是因为MongoDB的“可扩展”概念是所有操作一次只处理一个集合而不尝试“JOINS”。

node.js下有一些选项,例如Mongoos e,允许您从另一个“相关”集合中.populate()项。但这里的一般问题是你无法“查询”“相关”信息。所有这些真正实现的是“幕后查询”方法。因此实际执行了多个查询。要通过“相关”信息找到最佳方法,通常是:

var catId = db.category.findOne({ "name": "GAME_CATEGORY_POPULAR" })._id;

db.category.find({ "gameCategory_id": catId })

因为什么都不会让你通过外国收藏中的值来查询“游戏”集合。

“嵌入”和通常“复制”数据的想法对于习惯于关系数据库概念的人来说可能看起来很陌生。但实际上你应用像MongoDB这样的解决方案的原因应该是你意识到某些“关系模式”并不适合你的应用程序。

如果你没有以这种方式看待这个,那么也许你应该坚持使用关系数据库方法并使用这些工具。至少在你“找到”实际的缺点并意识到为什么你需要围绕它“设计”之前。

忘掉你所学到的知识。