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

Express/MongoDB: how to get a value from a nested field

首先,如果我没有使用正确的词或者这个问题很愚蠢,我很抱歉,我对此很陌生并且还在学习,这次我无法找到答案我的搜索!

我有一个 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});我用它得到了带有它们的值的整个项目列表,我尝试的所有其他事情都让我出错。所以也许我的架构不正确?

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

知道答案也会帮助我知道以后如何更改此值。

感谢阅读!

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

但我已经看到了另一个主题,所以是的,有:

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

我可以得到值,但它对我一点帮助都没有,因为你必须写值才能得到值....但我想在不知道值的情况下进行查询,因为这值会改变。

此外,我需要更多关于 Express 方面的建议。

谢谢。

查询将是这样的:

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

1表示你要获取那个字段,不代表它的值。 _id 通常总是 returned,所以我将它设置为 0 而不是 return 在这种特殊情况下。项目名称作为参数传递;在本例中,它是 item1.

查询会 return 像这样:

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

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