我有两个系列,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
的名称。但是这里搜索的合理模式是什么?
答案 0 :(得分:1)
不要使用$regex
,除非它是直接的(使用mongodb $regex
)syntax。
这应该有效:
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});
}});