MongoDB更新依赖于json输入的嵌套对象



我有以下形式的json数据:

[
{"size":100,"year":2015,"geography":"London","age":"21","gender":"Female"},
{"size":80,"year":2015,"geography":"Cardiff","age":"38","gender":"Male"},
{"size":80,"year":2013,"geography":"Edinburgh","age":"36","gender":"All"}
]

我正在尝试将其添加到具有以下架构的数据库集合中:

const Schema = new Schema({
geography: String,
size: {
2013: {
male: { 
age: {
}
} 
female: {
age: {
}
}
all: {
age: {
}
}
}
}
});

我目前正在尝试通过以下方式设置更新:

query = { geography : geography};
update = { geography : geography, $set: { "year.gender.age" : size}
Schema.updateOne( query, update, { upsert: true }; 

此处的$set显然不起作用,因为更新不知道从 json 数据中提取值。我尝试制作年份、性别和年龄变量,然后重构集合(见下文(,但这也不起作用。

$set: { `${year}.${gender{.$age}` }

因此,问题是如何使用 JSON 数据中的值来确定要更新的嵌入字段?

这里更好的选择是不同的非动态模式,如本答案所示。

尽管如此,如果要使用当前架构,则可以按如下方式映射 JSON 中的值:

例如,如果你有一个对象,比如

const obj = {
"size": 100,
"year": 2015,
"geography": "London",
"age": "21",
"gender": "Female"
}

将其转换为表单的更新对象

{
"geography": "London",
"2015.female.21": 100
}

需要以下映射:

const obj = {
"size": 100,
"year": 2015,
"geography": "London",
"age": "21",
"gender": "Female"
}
const doc = Object.keys(obj).reduce((acc, curr) => {
if (curr === "geography") {
acc["geography"] = obj[curr];
return acc;
};
switch(curr) {
case "year":
case "gender":
case "age":
acc[`${obj['year']}.${obj['gender'].toLowerCase()}.${obj['age']}`] = obj['size']
}
return acc;
}, {});
console.log(JSON.stringify(doc, null, 4));

然后,您可以在更新操作中将其用作

Model.updateOne( query, { '$set': doc }, { upsert: true }, callback );

为了创建这样的对象-{"size":100,"year":2015,"geography":"London","age":"21","gender":"Female"}

我认为您需要将架构设置为:

const Schema = new Schema({
geography: String,
size: Number,
year,: String,
gender: String,
age: String
});

然后要更新,请使用以下内容:

update = { {$and: [{year:"2015"}, {age:"33"} /*and more*/]}, $set: { size : size}

最新更新