如何在猫鼬中转换为字符串?

Posted

技术标签:

【中文标题】如何在猫鼬中转换为字符串?【英文标题】:How to cast as string in Mongoose? 【发布时间】:2020-01-22 09:38:21 【问题描述】:

我在 mongoose 中有一个制造商架构,其中一些数据存储在 mongo 中。我的目标是能够通过表格编辑制造商的名称。但是更改名称并单击提交时出现以下错误。

制造商验证失败:_id: 路径“_id”处值“['example', 'exampleedited']”的转换为字符串失败

我知道与 _id 存在某种冲突,因为它是由 mongo 自动创建的。但在这种情况下,我需要使用 _id 作为对象名称。

这是我的 mongoose 架构

var manufacturerSchema    = mongoose.Schema(
    // The _id property serves as the primary key. If you don't include it
    // the it is added automatically. However, you can add it in if you
    // want to manually include it when creating an object.

    // _id property is created by default when data is inserted.
    _id:            "type" : String,
    mfgDiscount:   "type" : Number
, 
   // Include this to eliminate the __v attribute which otherwise gets added
    // by default.
    versionKey: false 
);

这里是更新

async update(editedObj)    

        // Load the corresponding object in the database.
        let manufacturerObj = await this.getManufacturer(editedObj.id);

        // Check if manufacturer exists.
        if(manufacturerObj) 

            // Manufacturer exists so update it.
            let updated = await Manufacturer.updateOne(

                // Set new attribute values here.
                $set:  _id: editedObj._id ); 

            // No errors during update.
            if(updated.nModified!=0) 
                response.obj = editedObj;
                return response;
            

更新功能

// Receives posted data that is used to update the item.
exports.Update = async function(request, response) 
let manufacturerID = request.body._id;
console.log("The posted manufacturer id is: " + manufacturerID);

// Parcel up data in a 'Manufacturer' object.
let tempManufacturerObj  = new Manufacturer( 
    _id: manufacturerID,
    id:    request.body._id,
);

// Call update() function in repository with the object.
let responseObject = await _manufacturerRepo.update(tempManufacturerObj);

// Update was successful. Show detail page with updated object.
if(responseObject.errorMessage == "") 
    response.render('Manufacturer/Detail',  manufacturer:responseObject.obj, 
                                        errorMessage:"" );


// Update not successful. Show edit form again.
else 
    response.render('Manufacturer/Edit',  
        manufacturer:      responseObject.obj, 
        errorMessage: responseObject.errorMessage );

;

这是表格

<% layout('../layouts/mainlayout.ejs') -%>

<form action="/Manufacturer/Update" method="POST">

<input type='hidden' name="_id" value= <%= manufacturer._id %> /> <br/>
<input type='text'  name="_id" 
   value="<%= manufacturer._id ? manufacturer._id : '' %>"  /><br/>
   <input type="submit" value="Submit">
</form>
<%= errorMessage %>

【问题讨论】:

从错误消息看来,它正在尝试将具有 2 个元素的数组:“示例”和“示例编辑”转换为字符串。知道这些值的来源吗? 我实际上修改了数组对象以使其更清晰。第一个对象始终是制造商名称的第一部分,第二个对象是在编辑时。所以假设制造商的名称是 dolebananas 并且我将其编辑为 dole oranges 它会使用数组 ['dole', 'dole oranges'] 输出错误跨度> 【参考方案1】:

这个我没测试过,但是_id在mongodb中不是字符串,是一种特殊的数据类型,不记得名字了。因此,当您尝试将其转换为字符串时,某些事情会变得不安并引发错误。在我编写的应用程序中(当然有很多剪切和粘贴)我从未定义 _id 所以没有遇到任何问题。

我认为,如果您将 _id 从架构中取出,您将得到您想要的。

如果你想让manufacturer.id作为主键,那么你必须明确地说出来,不要叫它_id

我会在制造商架构中添加一个名称字段。您可以将其设为主键或在名称上创建索引以加快访问速度

【讨论】:

以上是关于如何在猫鼬中转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

在猫鼬中匹配具有字符串值的数组?

如何仅在猫鼬中使用聚合填充嵌套在对象数组中的字段?

如何在猫鼬中为具有孩子的属性分配“null”或“undefined”

如何在猫鼬中找到随机记录[重复]

如何在猫鼬中查询多个集合

如何在猫鼬中获取 NumberLong 记录