动态Mongoose查找使用AND样式查询

时间:2013-06-19 01:53:23

标签: node.js mongodb mongoose mongodb-query

我有一种情况,用户可能会输入多个约束来返回结果。我试图在猫鼬中执行“查找”,我可以执行多个“和”。我认为下面的第一个块会返回我的结果,而是返回当前在我的数据库中的所有结果。我试图实现的最终目标是来自“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"
            }
        }
    ]
}

1 个答案:

答案 0 :(得分: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) {....