MongoDB插入/更新/删除数组的元素,该元素是另一个数组的元素

时间:2014-02-04 03:15:44

标签: arrays mongodb crud

考虑以下文件:

{
    "entity_id" : 10,
    "features" : 
    [ 
    {
        "10" : "Test System 2"
    }, 
    {
        "20" : "System 2 Description"
    }, 
    {
        "30" : ["Free", "Monthly", "Quaterly"]
    }, 
    {
        "40" : ["Day", "Swing"]
    }
],
}

我需要在尽可能少的陈述中实现以下目标:

  1. 给出如下文件:

    {"feature_id" : "30", "value" : ["Free"]}
    

    获取数组“features”的相应元素以包含[“Free”]而不是[“Free”,“Monthly”,“Quaterly”]

  2. 给出如下文件:

    {"feature_id" : "50", "value" : ["Bonds", "Commodities"]}
    

    创建数组“features”的新元素,如

    {"50" : ["Bonds", "Commodities"]}
    
  3. 给出如下文件:

    {"feature_id" : "40", "value" : ""} 
    
  4. 从数组“features”中删除相应的元素。

1 个答案:

答案 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不匹配)。

示例1

  

给出如此的文件:

     

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

示例2

  

给出如此的文件:

     

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

示例3

  

给出如此的文件:

     

{“feature_id”:“40”,“value”:“”}

     

从数组“features”中删除相应的元素。

样本更新:

db.docs.update(
    // Criteria (assumes entity_id is unique)
    {
        entity_id: 10,
    },

    // Update
    { $pull: {
        "features" : { "feature_id" : "40" }
    }}
)