javascript - 使用属性数组查询 Mongoose HashMap ?

标签 javascript node.js mongodb mongoose

我有一个名为 csgoItems 的 Mongoose 文档和架构,如下所示:

{
    "_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_hash_names 数组来返回仅包含那些市场哈希名称的项目列表,如下所示

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);
        }

我怎样才能达到这些结果?

最佳答案

查询不起作用,因为 $in运算符仅适用于数组。

要根据哈希属性过滤查询结果,您需要使用 MongoDB 的 mapReduce

一个简单的解决方案是:

  1. 定义一个函数将 HashMap 转换为数组

    function hashToArray(hash) {
      return Object.keys(hash).map(function(key) {
        return hash[key];
      });
    }
    
  2. 定义mapReduce查询的选项

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

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

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

关于javascript - 使用属性数组查询 Mongoose HashMap ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36380014/

相关文章:

javascript - 如何使用 webpack 从 node_modules 加载静态 CSS 文件的示例?

node.js - 如何使用 Electron 和 React 显示从文件中读取的数据?

javascript - 使用在水线/sails 中查找来获取更少的字段

node.js - 读取外部 JSON 文件 - NodeJs

java - MongoDB查询更新对象的嵌套列表

Javascript:使用 "Module Pattern"引用变量,有什么想法吗?

javascript - 匹配不以 & 开头的单词

javascript - 静音YouTube将视频嵌入Firefox

java - 如何使用聚合类将现有的 mongo db 查询转换为 Spring Boot

mongodb - 带有 docker-compose 的 AdminMongo 不起作用