【问题标题】:MongoDB - DBRefMongoDB-DBRef
【发布时间】:2012-02-01 13:17:38
【问题描述】:

我在使用 DBRef 时遇到了一些问题,请看这个案例:

db.fruit.save ({"_id" : "1" , "name" : "apple"});
db.fruit.save ({"_id" : "2" , "name" : "grape"});
db.fruit.save ({"_id" : "3" , "name" : "orange"});
db.fruit.save ({"_id" : "4" , "name" : "pineapple"});

db.basket.save ({"_id" : "1", "items" : [
    {"$ref" : "fruit", "$id" : "1", "quantity" : 5},
    {"$ref" : "fruit", "$id" : "3", "quantity" : 10}
]})

现在,让我们找到“篮子”集合:

> db.basket.find ()
{ "_id" : "1", "items" : [
    {
        "$ref" : "fruit",
        "$id" : "1"
    },
    {
        "$ref" : "fruit",
        "$id" : "3"
    }
] }

“数量”属性消失了?!有人知道为什么吗?有替代品吗?

谢谢。

【问题讨论】:

    标签: mongodb find dbref


    【解决方案1】:

    dbref 的语法是

      { $ref : <collname>, $id : <idvalue>[, $db : <dbname>] }
    

    但是您在 dbref 中添加了不受支持的数量字段。那就是问题所在。把它带到外面

    db.basket.save ({"_id" : "1", "items" : [
        {"quantity" : 5 , item : {"$ref" : "fruit", "$id" : "1"}},
        {"quantity" : 10, item : {"$ref" : "fruit", "$id" : "3"}}
    ]})
    

    什么样的样子(吓人)

    {
        "_id" : "1",
        "items" : [
            {
                "quantity" : 5,
                "item" : {
                    "$ref" : "fruit",
                    "$id" : "1"
                }
            },
            {
                "quantity" : 10,
                "item" : {
                    "$ref" : "fruit",
                    "$id" : "3"
                }
            }
        ]
    }
    

    但我的建议是,完全放弃 dbref,只使用像这样的简单结构

    db.basket.save ({"_id" : "1",items:[
                            {item_id:"1",quantity:50},
                            {item_id:"3",quantity:10}
                    ]})
    

    这更干净,看起来像

    {
        "_id" : "1",
        "items" : [
            {
                "item_id" : "1",
                "quantity" : 50
            },
            {
                "item_id" : "3",
                "quantity" : 10
            }
        ]
    }
    

    【讨论】:

    • 但是使用最后一种方法,我怎样才能获得所有的项目数据,比如加入?
    • 澄清一下,DBRef 中支持附加字段,因为它实际上只是一个 BSON 对象;但是,MongoDB shell 在呈现值时隐藏了$ref$id 和可选的$db 字段以外的字段。一些 ODM 实际上将附加值存储在 DBRef 对象中(Doctrine 使用类鉴别器值执行此操作)。也就是说,如果您总是引用同一个数据库和集合中的对象,那么没有 DBRef 肯定会更好,因为在这种情况下,$ref$db 是无用的开销。
    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 2012-11-01
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 2012-08-25
    • 2017-05-21
    • 1970-01-01
    相关资源
    最近更新 更多