Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用属性数组查询Mongoose哈希映射?_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript 使用属性数组查询Mongoose哈希映射?

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

我有一个mongoose文档和模式,名为csgoItems,如下所示:

{
    "_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];
      });
    }
    
  • 定义mapReduce查询的选项

    hashToArray
    函数将用于将
    哈希转换为每个文档的数组

    var options = {};
    options.map = function (){ 
      emit(this._id, hashToArray(this.items), 1);
    }
    options.reduce = function (key, values){ 
      return values[0];
    }
    
  • 执行map reduce并对结果运行查询

    csgoItems.mapReduce(options, function(err, model, stats) {
      model.find({"items.market_hash_name": {$in: searchItems}},   function(err, foundItems){
        // use the result
      });
    });
    

  • 您最好更改模式,以便从键中取出数据,并将
    items
    设置为数组。我之所以不这样做,是因为此“items”对象包含数千个项。为了提高性能,我宁愿使用散列/映射来查看值是否存在,而不是在整个数组中循环并检查每个ObjectUnderstand,但是如果对数组中需要搜索的字段进行索引,仍然可以快速找到单个元素。这真的是唯一正确的方法。啊,好吧,也许我会走这条路。谢谢你,这很有效。我可能会重新考虑,走约翰尼的路,为这些属性编制索引。非常感谢。