我正在学习如何使用 MongoDB。我需要一段时间才能将我的思维方式从 RDBMS/SQL 转变为 NoSQL。
以下面的表和查询为例,我希望有人能解释我如何使用 mongrel 实现这个简单的 RDBMS 模式,以及如何使用 mongodb 实现查询。
CREATE TABLE tag_category (id INT NOT NULL, name VARCHAR(32) );
CREATE UNIQUE INDEX idxu_tag_cat ON tag_category(name);
INSERT INTO tag_category(1, 'books');
INSERT INTO tag_category(3, 'music');
INSERT INTO tag_category(4, 'food');
CREATE TABLE tag (id INT NOT NULL,
categ_id INT REFERENCES tag_category(id),
tagval VARCHAR(32) NOT NULL
);
INSERT INTO tag (1,1,'romance');
INSERT INTO tag (2,1,'scifi');
INSERT INTO tag (3,1,'thriller');
INSERT INTO tag (4,2,'rap');
INSERT INTO tag (5,2,'country');
INSERT INTO tag (6,2,'jazz');
INSERT INTO tag (7,2,'classical');
INSERT INTO tag (8,3,'Chinese');
INSERT INTO tag (9,3,'Italian');
INSERT INTO tag (10,3,'French');
INSERT INTO tag (11,3,'South African');
CREATE TABLE item (id INT,
entry_date DATE NOT NULL,
name VARCHAR(32) );
CREATE UNIQUE INDEX idxu_item ON item(name);
INSERT INTO item (id, entry_date, name) VALUES(1, '2011-01-01', 'A love supreme');
INSERT INTO item (id, entry_date, name) VALUES(2, '2011-01-01', 'A kind of blue');
INSERT INTO item (id, entry_date, name) VALUES(3, '2011-02-01', 'Believe the hype');
INSERT INTO item (id, entry_date, name) VALUES(4, '2011-01-01', 'Raising Hell');
INSERT INTO item (id, entry_date, name) VALUES(5, '2011-01-01', 'The Chronic');
INSERT INTO item (id, entry_date, name) VALUES(6, '2011-02-01', 'Blue Danube');
INSERT INTO item (id, entry_date, name) VALUES(7, '2011-01-01', 'Schubert Sonata in B flat');
INSERT INTO item (id, entry_date, name) VALUES(8, '2011-01-01', 'Also Sprach Zarathrustra' );
-- ...
CREATE TABLE item_tag (id INT,
item_id INT REFERENCES tag(id),
name VARCHAR(32) );
-- INSERT INTO item_tag (id, item_id, name) VALUES () ....
查询
为简洁起见,我将描述一个查询,它(希望)包含我期望遇到的大多数用例场景。下面的查询对于使用 SQL 实现是微不足道的 - 使用 mongrel,我不太确定如何做到这一点:
- 获取所有标记为 RAP 或古典(在音乐类别中)且条目日期大于“2011-01-01”的项目
回顾一下我的问题:
- 我将如何“移植”上面的模式以便它可以在 mongodb 中实现
- 如何使用 mongodb API 请求上述查询中描述的项目?
我熟悉 Python 和 PHP - 所以使用 PHP 或 Python API 的解决方案会很棒(尽管我偏向于 Python)。