0

有收藏

city: {"_id", "name"}

company: {"_id", "name", "cityID"}

comments: {"_id", "text", "companyID"}

您必须选择对某个城市的公司的最后 10 条评论。

现在我先选择城市中所有公司的_id,然后在_id上收到10条评论,代码如下:

$ db-> execute ('function () {

var result = {};

var company = [];
result.company = [];
db.company.find ({"city": "msk"}, {"title": 1, "_id": 1}). forEach (function (a) {
result.company [a._id] = Object.deepExtend (a, result [a._id]);
company.push (a._id);
});


var comments = [];
result.comments = [];
db.comments.find ({"company": {"$ in": company}}). sort ({"createTime": -1}). limit (10). forEach (function (a) {
result.comments [a._id] = Object.deepExtend (a, result [a._id]);
comments.push (a._id);
});


return result;

} ');

Esti 是做我需要的更好的选择吗?提前感谢您的建议!

4

1 回答 1

0

现在你的代码

db.comments
  .find({"company": {"$in": company}})
  .sort({"createTime": -1})
  .limit(10)

仅获取指定城市的最后 10 条评论,而不是每家公司的最后 10 条评论。这是你想要的吗?如果是这样,那么只为每个评论存储一个“城市”字段,然后根据城市查询评论集合可能是有意义的。

如果您想为每家公司持续 10 次,使用您当前的模式,您将不得不对每家相关公司的评论集合进行单独查询。

您的数据的用例是什么?

编辑:

在关系数据库模型中,您将能够执行一个 JOIN 查询,该查询将在一个查询中从两个表(公司和评论)中获取信息。但是,由于 MongoDB 不支持连接,如果您希望能够在单个查询中获取所需的信息,那么您需要通过在评论集合中存储一个城市字段来对数据进行一些非规范化。

于 2012-09-21T16:58:49.533 回答