我正在尝试使用mongoose通过传递一个标记数组来使用.where()来过滤一些结果。它可以有效地查找与其中一个数组项匹配的文档,但我需要更精确的东西。
var tags = ["cow","bus"];
var query = Contact.find({name: query.name}).where('tags').in(tags).exec(callback);
这将返回其标记数组中包含cow或bus的联系人。
我要做的是缩小范围,找到一个既有“牛”又有“公共汽车”的联系人,但没有完全匹配。
例如
Filter Tags: "cow","bus"
contact1
tags: ["cow","bus","chicken"]
contact2
tags: ["cow","bus","pokemon"]
contact3:
tags: ["bus"]
contact4:
tags: ["cow","plane","pie"]
contact5:
tags: ["cow","bus"]
我希望查询返回联系人1,2和5。
我发现如果我这样做,
var query = Contact.find({name: query.name})
.where('tags').in(["cow"])
.where('tags').in(["bus"]);
它有效,但似乎hacky /马虎,它是硬编码。我猜它是一个动态$并使用传递的数组。
任何指针?
答案 0 :(得分:2)
您可以使用$all
查询运算符:
Contact.find({name: query.name, tags: {$all: tags}}).exec(callback);
仅匹配name
匹配query.name
且tags
包含'cow'
和'bus'
元素的文档。
答案 1 :(得分:0)
因此,当我填写这个问题时,为了节省人们的时间,我试图进行更多挖掘。我找到了一个似乎有用的解决方案。
我创建了一个标记对象数组并将其传递给$和query参数。我正在使用lodash,但我相信没有它我就能做到。
var tags = ["cow","bird"];
var objectTags = [];
_.each(tags, function(tag){
objectTags.push({tags: tag});
});
Contact.find({name: query.name, $and: objectTags}).exec(callback);
如果有人知道更有效的方式,请随时告诉我!我希望这有助于将来的某个人。