【问题标题】:Dynamic Mongoose Find using AND style query使用 AND 样式查询的动态 Mongoose 查找
【发布时间】:2013-06-15 10:13:25
【问题描述】:

我有一种情况,用户可能会输入多个约束以返回结果。我正在尝试在猫鼬中执行“查找”,我可以执行多个“和”。我认为下面的第一个块会返回我的结果,而是返回当前在我的数据库中的所有结果。我试图实现的最终目标是来自“5B6D8B”和“BA4D2A”的两个十六进制值条目,仅当 perc >= 5 时才为我提供路径。如果我只是通过“{hex:”5B6D8B”, 'img .perc': {$gte: 5} }" 找到它会拉回一个正确的结果。

clrModel.find([{hex: "5B6D8B", 'img.perc': {$gte: 5} },
{hex: "BA4D2A", 'img.perc': {$gte: 5} }] ,'img.path', function(error,data){});

第二部分是我想,如果可能的话,动态地构建传递给“find”的值。似乎我不能将它作为字符串传递,因为它不起作用。关于如何实现这一目标的任何想法?下面的块是我试图做的,但它不起作用。不确定它是否有助于更好地理解我试图做的事情。下面显示的“finalFind”是我将作为第一个参数传递给查找查询的结果。提前致谢!

var hex, perc, finalFind = '{';
for(var i = 0; i < numIndicies; i++){
    finalFind += '{hex:"' + hexArr[i] + '", {perc: {$gte:' + percArr[i] + '}}}';
    //Handle our end character
    if(i !== numIndicies-1)
        finalFind += ',';
    else
        finalFind += '}';
}

------- 编辑下方显示文档示例--------

以下项目代表一个文档条目

{
    "__v": 0,
    "_id": {
        "$oid": "51c1ac95f502f20969000022"
    },
    "hex": "BA4D2A",
    "img": [
        {
            "path": "http://example.com/image1.jpg",
            "perc": 10,
            "_id": {
                "$oid": "51c1ac95f502f20969000023"
            }
        },
        {
            "path": "http://example.com/image2.jpg",
            "perc": 20,
            "_id": {
                "$oid": "51c1ac95f502f20969000034"
            }
        }
    ]
}

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    好吧,对于同一个属性(十六进制),你不能有两个值的 AND,因为这是不可能的,所以我假设你想要一个 AND 子句和一个 OR 子句,如下所示。 AND 是您的条件对象的默认值,因此您只需 $or 您的十六进制值。

    clrModel.find({
      'img.perc': {$gte: 5},
      $or: [
        {hex: "5B6D8B"},
        {hex: "BA4D2A"}
      ]
    }, 'img.path', function(error,data) {....
    

    应该返回相同结果的另一个变体:

    clrModel.find({
      'img.perc': {$gte: 5},
      hex: {$in: ["5B6D8B", "BA4D2A"]}
    }, 'img.path', function(error,data) {....
    

    【讨论】:

    • 谢谢彼得!这对我来说很愚蠢。我在想,如果我使用它,或者它只会返回一个或另一个,我应该从查询的角度考虑它。您可能已经知道,这太棒了!关于如何将诸如“[”5B6D8B”,“BA4D2A”]”之类的东西转换为可以传递给十六进制条目十六进制的对象的任何想法:{$in:[“5B6D8B”,“BA4D2A”]} ?当我使用 JSON.parse 时,它​​给了我一个错误,指出有一个额外的字符','。我将把它设置为已解决,因为我的主要问题已解决。再次感谢!
    • 我的猜测是您正在循环中构建一个十六进制值的字符串数组,并且您的代码在末尾添加了一个额外的逗号。但是,我认为您不必要地从字符串数组到 JSON 字符串再回到字符串数组。直接使用hex: {$in: hexArr}即可。
    • 最后一个问题,我保证 :) 我在数据库中的文档看起来像我上面编辑中的条目。例如,如果我想拉回与我的十六进制匹配的文档,其中子文档 img.perc 值大于 5,我可以在下面的行中执行嵌套查询吗?每个文档都包含不同的十六进制值。所以在传递的数组中,如果百分比也匹配,我只想选择它。十六进制:{$in: ["5B6D8B", "BA4D2A"]}
    • 请提交一个单独的问题。不鼓励扩展评论线程。
    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 2010-09-26
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多