Javascript 使用属性数组查询Mongoose哈希映射?
我有一个mongoose文档和模式,名为csgoItems,如下所示:Javascript 使用属性数组查询Mongoose哈希映射?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我有一个mongoose文档和模式,名为csgoItems,如下所示: { "_id": { "$oid": "56ff8fb815ad7ecdede3bc3c" }, "csgo_number": 1, "last_updated": 1459589048324, "items": { "Shadow Daggers | Urban Masked (Well-Worn)": { "market_ha
{
"_id": {
"$oid": "56ff8fb815ad7ecdede3bc3c"
},
"csgo_number": 1,
"last_updated": 1459589048324,
"items": {
"Shadow Daggers | Urban Masked (Well-Worn)": {
"market_hash_name": "Shadow Daggers | Urban Masked (Well-Worn)",
"sale_price": 134.29
},
"Shadow Daggers | Urban Masked (Minimal Wear)": {
"market_hash_name": "Shadow Daggers | Urban Masked (Minimal Wear)",
"sale_price": 108.3
},
"Shadow Daggers | Urban Masked (Field-Tested)": {
"market_hash_name": "Shadow Daggers | Urban Masked (Field-Tested)",
"sale_price": 79.73
},
"Shadow Daggers | Urban Masked (Battle-Scarred)": {
"market_hash_name": "Shadow Daggers | Urban Masked (Battle-Scarred)",
"sale_price": 73.17
},
"Shadow Daggers | Stained (Well-Worn)": {
"market_hash_name": "Shadow Daggers | Stained (Well-Worn)",
"sale_price": 113.25
}
}
}
我试图使用一个market\u hash\u名称数组来返回一个项目列表,其中只包含像这样的market\u hash名称
var searchItems = ["Shadow Daggers | Stained (Well-Worn)", "Shadow Daggers | Urban Masked (Battle-Scarred)"]
我试过这个
csgoItems.find({"items": {$in: searchItems}}, function(err, found){
if(err){
console.log(err);
}else{
console.log(found);
}
如何获得这些结果?查询不起作用,因为运算符只处理数组 要根据散列的属性筛选查询结果,需要使用MongoDB的 一个简单的解决办法是:
function hashToArray(hash) {
return Object.keys(hash).map(function(key) {
return hash[key];
});
}
hashToArray
函数将用于将项
哈希转换为每个文档的数组
var options = {};
options.map = function (){
emit(this._id, hashToArray(this.items), 1);
}
options.reduce = function (key, values){
return values[0];
}
csgoItems.mapReduce(options, function(err, model, stats) {
model.find({"items.market_hash_name": {$in: searchItems}}, function(err, foundItems){
// use the result
});
});
您最好更改模式,以便从键中取出数据,并将
items
设置为数组。我之所以不这样做,是因为此“items”对象包含数千个项。为了提高性能,我宁愿使用散列/映射来查看值是否存在,而不是在整个数组中循环并检查每个ObjectUnderstand,但是如果对数组中需要搜索的字段进行索引,仍然可以快速找到单个元素。这真的是唯一正确的方法。啊,好吧,也许我会走这条路。谢谢你,这很有效。我可能会重新考虑,走约翰尼的路,为这些属性编制索引。非常感谢。