考虑以下文件:
{
"entity_id" : 10,
"features" :
[
{
"10" : "Test System 2"
},
{
"20" : "System 2 Description"
},
{
"30" : ["Free", "Monthly", "Quaterly"]
},
{
"40" : ["Day", "Swing"]
}
],
}
我需要在尽可能少的陈述中实现以下目标:
给出如下文件:
{"feature_id" : "30", "value" : ["Free"]}
获取数组“features”的相应元素以包含[“Free”]而不是[“Free”,“Monthly”,“Quaterly”]
给出如下文件:
{"feature_id" : "50", "value" : ["Bonds", "Commodities"]}
创建数组“features”的新元素,如
{"50" : ["Bonds", "Commodities"]}
给出如下文件:
{"feature_id" : "40", "value" : ""}
从数组“features”中删除相应的元素。
答案 0 :(得分:1)
根据您所需的更新,您的数据模型不易使用。
如果您想使用数组,我建议您将文档结构更改为:
{
"entity_id" : 10,
"features" : [
{
feature_id: "10",
value : "Test System 2"
},
{
feature_id: "20",
value: "System 2 Description"
},
{
feature_id: "30",
value: ["Free", "Monthly", "Quaterly"]
},
{
feature_id: "40",
value: ["Day", "Swing"]
}
],
}
或者,您可以建模为嵌入式文档:
{
"entity_id" : 10,
"features" : {
"10" : "Test System 2",
"20" : "System 2 Description",
"30" : ["Free", "Monthly", "Quaterly"],
"40" : ["Day", "Swing"]
}
}
建模作为数组的好处是,您可以在所有要素/值中添加multikey index。
如果您建模为嵌入式文档,则可以直接引用字段(即features.10
)。这假设您知道键将是什么,并且您必须单独索引每个特征值。
我将假设以下示例的第一种格式。另请注意,您的键值必须与类型匹配(因此字符串"10"
与数字10
不匹配)。
给出如此的文件:
{“feature_id”:“30”,“value”:[“Free”]} 获取数组“features”的相应元素以包含[“Free”]而不是[“Free”,“Monthly”,“Quaterly”]
样本更新:
db.docs.update(
// Criteria (assumes entity_id is unique)
{
entity_id: 10,
features: {
// Using $elemMatch to find feature_id with string "30"
$elemMatch: { feature_id: "30" },
}
},
// Update
{ $set: {
"features.$.value" : ["Free"]
}}
)
给出如此的文件:
{“feature_id”:“50”,“value”:[“Bonds”,“Commodities”]} 创建数组“features”的新元素,如
{“50”:[“Bonds”,“Commodities”]}
样本更新:
db.docs.update(
// Criteria (assumes entity_id is unique)
{
entity_id: 10,
},
// Update
{ $push: {
"features" : { "feature_id" : "50", value: ["Bonds", "Commodities"] }
}}
)
给出如此的文件:
{“feature_id”:“40”,“value”:“”}
从数组“features”中删除相应的元素。
样本更新:
db.docs.update(
// Criteria (assumes entity_id is unique)
{
entity_id: 10,
},
// Update
{ $pull: {
"features" : { "feature_id" : "40" }
}}
)