如何在MongoDB上建模这些数据

时间:2018-02-03 18:04:38

标签: mongodb mongodb-query

我有这些数据:

{
    "_id" : ObjectId("5a75baada0f20bd4e612d480"),
    "Number" : 400,
    "Page" : 24,
    "DC" : "NE",
}

{
    "_id" : ObjectId("5a75baada0f20bd4e612d489"),
    "Number" : 300,
    "Page" : 14,
    "DC" : "100",
}

我想对这些数据进行建模,使其保持这样:

{Crs:{[
   {Cr: {
        "_id" : ObjectId("5a75baada0f20bd4e612d480"),
        "Number" : 400,
        "Page" : 24,
        "DC" : "NE",
    }},
   {Cr: {
        "_id" : ObjectId("5a75baada0f20bd4e612d489"),
        "Number" : 300,
        "Page" : 14,
        "DC" : "100",
    }},
]}}

我读过一些关于嵌入式文档的模型一对多关系,但我真的不知道它是如何工作的。 https://docs.mongodb.com/manual/core/data-model-design/

2 个答案:

答案 0 :(得分:1)

我认为这里的文档应该有所帮助:https://docs.mongodb.com/manual/reference/operator/update/positional/#update-documents-in-an-array

在你的情况下,它会与此类似:

db.nameOfCollection.updateOne(
  { _id: ObjectId('idhere'), "Crs.Cr.Number": 400 },
  { $set: { "Crs.$.Cr.DC" : "SomethingNew" } }
)

有一点,我不确定你的数据结构是否正确,因为你在一个对象中有一个数组...为什么不只是一个数组,即

Crs: [{...}, {...}]

答案 1 :(得分:1)

使用聚合

> db.crs.aggregate(
    [
        {$group : {_id : null, crs : {$push : {cr : "$$ROOT"}}}},
        {$project : {_id : 0}}
    ]
).pretty()

您还可以使用$out

将结果数据写入另一个集合

在汇总管道中添加以下作为最后一个阶段

{$out : "crs"} // create collection crs

输出

> db.crs.aggregate([{$group : {_id : null, crs : {$push : {cr : "$$ROOT"}}}}, {$project : {_id : 0}}]).pretty()
{
    "crs" : [
        {
            "cr" : {
                "_id" : ObjectId("5a75baada0f20bd4e612d480"),
                "Number" : 400,
                "Page" : 24,
                "DC" : "NE"
            }
        },
        {
            "cr" : {
                "_id" : ObjectId("5a75baada0f20bd4e612d489"),
                "Number" : 300,
                "Page" : 14,
                "DC" : "100"
            }
        }
    ]
}
>