我有这个文件:
{
"_id": ObjectId("xxx"),
"props": {
"a": "a1",
"b": "b2"
}
}
我的查询如下:
db.collection.find({"$and": [ {"props.a" : "a1"}, {"props.b": "b2"} ]}
我从GET值中获取查询的元素:
/api/search?a=a1&b=b1
所以,我需要一种从GET对象开始生成我的查询的方法......
我想到了这样的事情:
// Little helper to get the object key name by index
Object.prototype.key = function key(int) { var j = -1; for(var i in this) { j++; if(j==int) { return i; } else { continue; } } }
// My attempt
var query = [],
i = 0;
_.each(req.query, function(prop) {
var key = req.query.key(i);
query.push({"props." + key: prop});
i = i + 1;
});
但它不起作用......
如果我这样做:
_.each(req.query, function(prop) {
var key = {};
key.properties = {};
key.properties[req.query.key(i)] = prop ;
props.push(key);
i = i + 1;
});
我明白了:
[{ props: { a: 'a1' } }, { props: { b: 'b1' } } ]
但是通过这种方式我只能得到这个查询:
db.collection.find({"$and": [ { props: { a: 'a1' } }, { props: { b: 'b1' } } ]}
这与我上面写的完全不同(这个搜索的道具与我提供的道具完全相同,而原始版本则查找包含其中一个值的道具)
我该怎么办?
答案 0 :(得分:0)
好的我找到了一个解决方案,在google上搜索没有返回任何解决方案......
var query = {"$and": []},
props = [],
i = 0;
_.each(req.query, function(prop) {
var key = {};
key["properties." + req.query.key(i)] = prop ;
props.push(key);
i = i + 1;
});
query.$and = props;
这样生成的查询就像我需要的那样。