0

所以我有两个集合,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);
    });
});

这可行,但我希望对象按 Trait 文档上的字段排序(不在 Question 文档中):

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?" }
]

所以在上面的例子中,如果所有三个特征都缺失,我只想带回年龄和身高(按此顺序)。是否可以以某种方式修改查询或匹配对象以促进这一点?

谢谢你。

4

1 回答 1

0

如果我理解你的问题是正确的,你想找到两个最重要的特征吗?如果您的missingTraits数组只是特征的名称(“Height”、“Weight”、“Age”),那么在将查询发送到 Questions 集合之前,您需要查询 Traits 集合以找到最重要的两个。

不幸的是,如果不单独调用 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
    });
});

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

在这种情况下,告诉 Questions 集合以“Age”、“Height”顺序返回文档很困难,因此我建议缓存从 Traits 集合返回的特征的重要性顺序,然后对查询结果进行排序客户端提问。

以下是文档sort()

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

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

于 2012-09-21T15:33:30.773 回答