在collection.find中包含第二个集合的相关数据

时间:2013-07-01 10:07:49

标签: meteor

我有两个系列,foo和bar。它们看起来像这样:

foo: {name: SOMENAME, barId: MONGO_ID}
bar: {name: ANOTHERNAME}

我使用此查询搜索foo集合:

searchFoo = function(query) {
    var re = new RegExp(query, "i");
    FooCollection.find({
        name: {
            $regex: re
        }
    });
};

所有找到的foo项都显示在列表中。这很好用。问题是,如何显示查询与连接的foo项名称匹配的bar项?如果可能,我不想在bar文档中加入foo

我知道MongoDB中没有连接。我知道当我有bar时,我可以通过第二次查询得到foo的名称。但是这里搜索的合理模式是什么?

2 个答案:

答案 0 :(得分:1)

不要使用$regex,除非它是直接的(使用mongodb $regexsyntax

这应该有效:

searchFoo = function(query) {
    var re = new RegExp(query, "i");
    return FooCollection.find({
        name: re
    });
};

应该这样:

searchFoo = function(query) {
    return FooCollection.find({
        name: { $regex: query, $options: "i" }
    });
};

此外,为了链接您的条形码查询,请执行转换而不是正则表达式:

FooCollection.find({name:"SOMENAME"}, {transform:function(doc) {
    if(doc.barId) doc.bar = FooCollection.findOne(doc.barId)
    return doc;
}});

这应该给你结果(在fetch之后或者你通过光标解析)

[{
  name: SOMENAME, barId: MONGO_ID,
  bar : { name: ANOTHERNAME}
}]

有关转换的更多信息,请参阅Collections

下的meteor文档

答案 1 :(得分:0)

转换也应该反过来:

BarCollection.find({name:"ANOTHERNAME"}, {transform:function(barDoc) {
    return FooCollection.findOne({barId:barDoc._id});
}});