我尝试将一个文档插入到集合中,但是当我指定_id插入文档的字段时出现此错误。那么如何插入_id除 之外的类型的文档呢ObjectId?
下面的代码给了我这个错误。当我删除 时_id,一切正常,但 _id 将自动生成。我只是希望它是字符串类型。我知道这是可能的。我可以_id使用 MongoDB shell 制作字符串。
async function foo() {
const users = client.db("test").collection("users")
users.insertOne({
_id: "a string",
name: "Tom",
age: 26,
})
}
Run Code Online (Sandbox Code Playgroud) 我是 Rust 新手,我想知道移动变量时到底会发生什么。
struct Point {
x: i32,
y: i32,
}
fn main() {
let p = Point { x: 1, y: 1 };
let q = p;
}
Run Code Online (Sandbox Code Playgroud)
当 时let q = p;,数据(大小为 8 字节)是否会从一个内存地址复制到另一个内存地址?由于p已移至此处,因此无法再使用,我认为最好使q' 的底层内存地址等于p' 。换句话说,我认为机器代码中不复制任何内容是可以的。
所以我的问题是:移动变量时数据会逐字节复制吗?如果会,为什么?
我用 Rust 编写了一个简单的程序。这个程序可以编译。
use std::cell::{Ref, RefCell};
fn print_number(x: &i32) {
println!("x is {}", x);
}
fn main() {
let stack: i32 = 42;
let reference: &i32 = &stack;
let refcell: RefCell<&i32> = RefCell::new(reference);
let wrapped: Ref<'_, &i32> = refcell.borrow();
print_number(&wrapped);
print_number(*wrapped);
}
Run Code Online (Sandbox Code Playgroud)
我可以说出两者都有效的原因:
&有效,因为&wrapped的类型为&Ref<&i32>,可以被解引用强制为&&i32,也可以被解引用强制为&i32。*有效,因为*wrapped相当于*Deref::deref(&wrapped). 我们知道Deref::deref(&Ref<&i32>)结果为&&i32,因此*Deref::deref(&Ref<&i32>)结果为*&&i32,即&i32。似乎第二种方法(使用*)更直接,但是 Rust 编译器建议我使用第一种方法(使用&)。如果我添加一行:
print_number(wrapped);
Run Code Online (Sandbox Code Playgroud)
这当然不能编译。但我对编译器报告感兴趣:
error[E0308]: …Run Code Online (Sandbox Code Playgroud)