首先,我很抱歉,如果我没有使用正确的词语,或者问题是愚蠢的,我对此很新,还在学习,这次我不是能够通过我的搜索找到答案!
我有一个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方面我需要更多建议。
谢谢。
答案 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);
}
);
没有正确的错误处理。如果用户不存在,没有项目字段等,则代码段将失败。