使用 Mongoose+Node.js 在 MongoDB 中存储非结构化 JavaScript 对象

Posted

技术标签:

【中文标题】使用 Mongoose+Node.js 在 MongoDB 中存储非结构化 JavaScript 对象【英文标题】:Store unstructured JavaScript object in MongoDB with Mongoose+Node.js 【发布时间】:2015-04-03 18:30:51 【问题描述】:

在我的 node.js 应用程序中,我需要将非结构化 javascript 对象存储在 MongoDB 中。我在 Mongoose 中指定了以下模型:

module.exports = mongoose.model('DBAllocation', 
    from: Date,
    expires: Date,
    userSession: Object,
    allocationTimestamp: Date,
    allocationPriority: Number,
    vmGroupID: String,
    allocationRequestContent: Object
);

通过将userSessionallocationRequestContent 的数据类型指定为Object 类型,我想将一个JavaScript 对象(不指定其结构) 保存到MongoDB 中并按原样检索它.但是当我将模型保存到数据库中时,我得到了一个内部错误。我尝试存储以下项目:

var allocation = new Allocation(
                        _id: allocationID,
                        from: Date.now(),
                        expires: null,
                        userSession: authorizedRequest.session,
                        allocationTimestamp: Date.now(),
                        allocationPriority: <some number>,
                        vmGroupID: <some number>,
                        allocationRequestContent: authorizedRequest.requestContent
                    );

authorizedRequest.sessionauthorizedRequest.requestContent 是两个 JavaScript 对象。但是当我将它们都替换为 时,模型会成功保存。我听说过strict 参数,我们可以使用它来存储非结构化数据,但我怀疑我是否可以使用它来实现我所需要的。有没有办法实现这一点?任何帮助将非常感激。

更新:

我发现 authorizedRequest.session 是一个 MongoDB 模型,我将其替换为 authorizedRequest.session.toObject() 并将 authorizedRequest.requestContent 替换为一个简单的对象,例如 'cat': '123', 'dog':'456'并且保存成功。不知道怎么回事。

authorizedRequest.requestContent 包含以下对象。


        "group":[
            
                "vm_count":[
                    "10"
                ],
                "image":[
                    
                        "type":[
                            "iso"
                        ],
                        "id":[
                            "280b40d0-6644-4e47-ac7c-074e2fa40cd4"
                        ]
                    
                ],
                "cpu":[
                    
                        "cores":[
                            "1"
                        ],
                        "frequency":[
                            "1"
                        ],
                        "unit":[
                            "GHz"
                        ],
                        "architecture":[
                            "x86"
                        ]
                    
                ],
                "min_memory":[
                    
                        "size":[
                            "2"
                        ],
                        "unit":[
                            "GB"
                        ]
                    
                ],
                "min_storage":[
                    
                        "primary":[
                            "5"
                        ],
                        "unit":[
                            "GB"
                        ]
                    
                ],
                "network":[
                    
                        "min_bandwidth":[
                            "8"
                        ],
                        "unit":[
                            "mbps"
                        ]
                    
                ],
                "priority":[
                    "3"
                ],
                "allocation_time":[
                    
                        "schedule":[
                            
                                "date":[
                                    
                                        "$":
                                            "year":"",
                                            "month":"",
                                            "date":""
                                        
                                    
                                ],
                                "time_from":[
                                    ""
                                ],
                                "time_to":[
                                    ""
                                ]
                            
                        ]
                    
                ]
            
        ],
        "session_id":[
            "3deb1bb861f34b527e6709c655fff139b36c2dc43d8b3e29e3914bf8b23ce069"
        ]
    

谢谢。

【问题讨论】:

试过 Schema.Types.Mixed (mongoosejs.com/docs/schematypes.html)? 是的。但仍然无法正常工作。似乎只接受一个简单的对象。当对象本身包含嵌套对象时,它会给出内部错误。 您能否将您遇到的错误的详细信息添加到您的问题中? @JohnnyHK,我没有收到详细的错误信息!调试时,我只得到Internal Error! Value is null @Deepal 根据您的更新,authorizedRequest.requestContent 中的某些内容似乎无法序列化为 BSON,以便可以将其存储在集合中。里面有什么? 【参考方案1】:

问题可能是 authorizedRequest.requestContent 对象中的 $ 键,因为 MongoDB 字段名称不能以 $ 开头。

请参阅the docs 了解可能的解决方法。

【讨论】:

以上是关于使用 Mongoose+Node.js 在 MongoDB 中存储非结构化 JavaScript 对象的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何允许使用 mongoose 驱动程序 API 的 Node.js 嵌入式数据库?

在 Node.js Mongoose 中,我想更新每个字段……我该怎么做?

node.js + express.js:使用 mongodb/mongoose 处理会话

如何让 node.js 使用 mongoose 连接到 mongolab

使用 mongoose(Node.js) 在 MongoDB 中搜索

使用 Mongoose+Node.js 在 MongoDB 中存储非结构化 JavaScript 对象