我可以通过MongoDB匹配对象添加或排序吗?

时间:2012-09-21 06:13:31

标签: mongodb sorting

所以我有两个系列,Trait和Question。对于给定的用户,我迭代用户的特征,并且我想查询与缺少的特征相对应的所有问题:

linq.From(missingTraits)
.ForEach(function(trait)
{
    match.$or.push({ "Trait": trait });
});

database.collection("Questions", function(err, collection)
{
    collection.find(match).limit(2).toArray(function(err, questions)
    {
        next(err, questions);
    });
});

这样可行,但是我希望这些对象按特征文档上的字段排序(不在问题文档中):

Traits
[
  { "Name": "Height", "Value": "73", "Importance": 15 },
  { "Name": "Weight", "Value": "230" "Importance": 10 },
  { "Name": "Age", "Value": "29", "Importance": 20 }
]

Questions
[
  { "Trait": "Height", "Text": "How tall are you?" },
  { "Trait": "Weight", "Text": "How much do you weight?" },
  { "Trait": "Age", "Text": "How old are you?" }
]

所以在上面的例子中,如果缺少所有三个特征,我想要只带回年龄和身高(按此顺序)。是否可以通过某种方式修改查询或匹配对象以实现此目的?

谢谢。

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你想找到两个最重要的特征吗?如果您的missingTraits数组只是特征的名称(“高度”,“权重”,“年龄”),那么您需要查询特征集合以找到最重要的两个,然后再将查询发送到问题集。

不幸的是,如果没有单独调用Traits集合,只修改您的Questions集合上的查询将无法工作,因为这是有关重要性的信息所在的地方。

这样的查询
database.collection("Traits", function(err, collection)
{
    collection.find(match).sort({ Importance : -1 }).limit(2).toArray(function(err, traits)
    {
        // cache the traits to query the questions collection
    });
});

将为您提供与$或查询匹配的两个最重要的特征(所有匹配,按重要性按降序排序,限制为2)。然后,您可以使用这些结果来查询Questions集合。

告诉问题集合返回“年龄”中的文档,在这种情况下“高度”顺序很难,所以我建议缓存从Traits集合中收到的特征的重要性顺序,然后对结果进行排序关于客户端问题的查询。

以下是sort()的文档:

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%7B%7Bsort%28%29%7D%7D

最后一件事:如果您通过对Traits集合的数据库调用填充missingTraits,那么应该可以将sort()逻辑放入该调用,而不是添加第二个调用集合。