Mongoose / Node动态查询

时间:2014-06-13 18:12:33

标签: node.js mongodb mongoose

我正在尝试使用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 /马虎,它是硬编码。我猜它是一个动态$并使用传递的数组。

任何指针?

2 个答案:

答案 0 :(得分:2)

您可以使用$all查询运算符:

Contact.find({name: query.name, tags: {$all: tags}}).exec(callback);

仅匹配name匹配query.nametags包含'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);

如果有人知道更有效的方式,请随时告诉我!我希望这有助于将来的某个人。