面试题答案
一键面试文档结构要求
- 插入的文档需为一个包含键值对的对象。键是字符串类型,代表字段名;值可以是各种合法的MongoDB数据类型,如字符串、数字、日期、数组、嵌套文档等。例如:
{
"name": "John",
"age": 30,
"hobbies": ["reading", "swimming"],
"address": {
"city": "New York",
"country": "USA"
}
}
字段类型要求
- 字段值必须是MongoDB支持的数据类型。常见数据类型包括:
- 基本类型:字符串(
String
)、数字(Number
,如NumberInt
、NumberLong
、Double
等)、布尔值(Boolean
)。 - 日期类型:
Date
,用于存储日期和时间。 - 数组类型:
Array
,可以包含各种数据类型的值。 - 嵌套文档类型:文档内可以嵌套其他文档,如上述例子中的
address
字段。
- 基本类型:字符串(
不符合要求时可能出现的错误
- 文档结构错误:如果插入的不是一个对象,如传递了一个数组,会报错。例如在Node.js中使用MongoDB驱动:
const { MongoClient } = require('mongodb');
const uri = "mongodb://localhost:27017";
const client = new MongoClient(uri);
async function run() {
try {
await client.connect();
const database = client.db('test');
const collection = database.collection('users');
// 错误示例,传递了数组而不是对象
const insertResult = await collection.insertOne([1, 2, 3]);
} catch (e) {
console.error(e);
} finally {
await client.close();
}
}
run().catch(console.dir);
上述代码运行会报错,因为insertOne
期望的第一个参数是一个文档对象,而不是数组。错误信息大致如下:
MongoError: document must be an object
- 字段类型错误:如果使用了不支持的字段类型,同样会报错。例如尝试插入一个JavaScript函数作为字段值:
async function run() {
try {
await client.connect();
const database = client.db('test');
const collection = database.collection('users');
// 错误示例,传递了函数作为字段值
const insertResult = await collection.insertOne({
"name": "Jane",
"func": function() { return 'test'; }
});
} catch (e) {
console.error(e);
} finally {
await client.close();
}
}
run().catch(console.dir);
这种情况下也会报错,错误信息类似:
MongoError: Unsupported field type: function