所以我有两个系列,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?" }
]
所以在上面的例子中,如果缺少所有三个特征,我想要只带回年龄和身高(按此顺序)。是否可以通过某种方式修改查询或匹配对象以实现此目的?
谢谢。
答案 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()
逻辑放入该调用,而不是添加第二个调用集合。