Express / MongoDB:如何从嵌套字段中获取值

时间:2017-11-06 10:37:29

标签: mongodb express mongodb-query mean-stack database-schema

首先,我很抱歉,如果我没有使用正确的词语,或者问题是愚蠢的,我对此很新,还在学习,这次我不是能够通过我的搜索找到答案!

我有一个MEAN项目,我想在我的前端从我的数据库中获取一个值(我使用Angular 4)。所以我尝试在Express上编写一个函数,但事实是我不知道怎么做,因为我甚至无法直接在mongo的命令行中获取值。

我的架构采用以下格式:

const userSchema = mongoose.Schema({
    username: {
        type: String,
        required: true,
        unique: true
    },
    email: {
        type: String,
        required: true,
        unique: true
    },
    password: {
        type: String,
        required: true
    },
    item: {
        item1: {
            type: Number,
            default: 0
        },
        item2: {
            type: Number,
            default: 0
        },
        item3: {
            type: Number,
            default: 0
        }
    }
});

想法是每个用户都有一个包含每个项目的特定数量的库存,我的目标是在使用项目名称进行请求时获取此特定数字。

但我能做的最好的是db.users.find({},{item:1});我用它们的价值得到了整个物品清单,我试过的每一件事都让我错了。也许我的架构不对吗?

所以我的问题是: 如何通过将项目名称作为参数传递来获取Express项目值,因为我知道我目前无法直接从mongo获取值?

知道答案也有助于我知道如何在以后更改此值。

感谢您阅读!

[编辑] 此主题标记为重复此主题: How to query nested objects?

但我已经看到了这个其他主题,所以是的,用:

db.users.find({ item : { item1 : "0" }}).count();

我可以获得价值,但它根本不能帮助我,因为你必须写值来获取价值....但我想在不知道价值的情况下进行查询,因为这价值会改变。

另外,在Express方面我需要更多建议。

谢谢。

1 个答案:

答案 0 :(得分:0)

查询将是这样的:

db.users.find({ username: "someuser" }, { "item.item1": 1, "_id": 0 })

1 表示您想要获取该字段,但它不代表其值。 _id通常总是返回,所以我将其设置为 0 ,在这种特殊情况下不返回它。项目名称作为参数传递;在这种情况下,它是 item1

查询将返回如下内容:

{ "item" : [ { "item1" : 123 } ] }

这是普通的JSON,因此可以轻松提取值。

在Mongoose中它会是这样的:

const itemname = 'item1';

User
  .findOne(
    { username: 'someuser' },
    { [`item.${itemname}`]: true, _id: false },
    (err, result) => {
      const response = {};

      if (err) {
        response.status = HttpStatus.INTERNAL_SERVER_ERROR;
        response.message = err;
      } else {
        response.status = HttpStatus.OK;
        response.message = result.item[itemname];
      }

      return res.status(response.status).json(response.message);
    }
  );

没有正确的错误处理。如果用户不存在,没有项目字段等,则代码段将失败。