【问题标题】:Mongoose/Node dynamic where queryMongoose/Node 动态 where 查询
【发布时间】:2014-08-04 09:03:52
【问题描述】:

我正在尝试使用 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"]);

它可以工作,但它看起来很老套/草率,而且是硬编码的。我猜它是一个动态的 $ 并使用传递的数组。

任何指针?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

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

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

    这只会匹配 name 匹配 query.nametags 包含 'cow''bus' 元素的文档。

    【讨论】:

    • 大声谢谢!我很高兴有一个非常简单的解决方案。老实说,我还没有看到,下次我一定会做一些更好的挖掘。
    【解决方案2】:

    所以当我填写这个问题时,为了节省人们的时间,我尝试做更多的挖掘工作。我想出了一个似乎可行的解决方案。

    我创建了一个标签对象数组并将其传递给 $and 查询参数。我正在使用 lodash,但我相信没有它你也可以做到。

    var tags = ["cow","bird"];
    var objectTags = [];            
    
    _.each(tags, function(tag){ 
         objectTags.push({tags: tag});      
    });
    
    Contact.find({name: query.name, $and: objectTags}).exec(callback);
    

    如果有人知道更有效的方法,请随时告诉我!我希望这对将来的某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-10-12
      • 2014-12-27
      • 2015-11-08
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多