Mongodb db.collectionX.save和db.collectionX.insert之间的差异
以下是我的观察: 插入到集合a后,项a的值不会修改 相反,在存储到集合b后,项b的值会发生更改 是否有任何规则可以指导这些修改,以便我知道在将值插入或保存到集合中之后应该期望什么Mongodb db.collectionX.save和db.collectionX.insert之间的差异,mongodb,Mongodb,以下是我的观察: 插入到集合a后,项a的值不会修改 相反,在存储到集合b后,项b的值会发生更改 是否有任何规则可以指导这些修改,以便我知道在将值插入或保存到集合中之后应该期望什么 感谢您保存,如果您提供_id,它将更新。如果没有,它将插入,这就是区别 对于保存,如果您提供_id,它将更新。如果不这样做,它将插入。Mongo的JavaScript shell的一个巧妙特性是,如果调用一个函数而没有执行parentesis,它将返回实现。如果您对MongoDB的任何方法感兴趣,并且不想对所有源代码进
感谢您保存,如果您提供_id,它将更新。如果没有,它将插入,这就是区别 对于保存,如果您提供_id,它将更新。如果不这样做,它将插入。Mongo的JavaScript shell的一个巧妙特性是,如果调用一个函数而没有执行parentesis,它将返回实现。如果您对MongoDB的任何方法感兴趣,并且不想对所有源代码进行排序,那么这将非常有用 在JS shell中:
> itemsA = { attrA : "vA", attrB : "vB" }
{ "attrA" : "vA", "attrB" : "vB" }
> db.collectionA.insert(itemsA)
> db.collectionA.find()
{ "_id" : ObjectId("4e85de174808245ad59cc83f"), "attrA" : "vA", "attrB" : "vB" }
> itemsA
{ "attrA" : "vA", "attrB" : "vB" }
> itemsB = { attrC : "vC", attrD : "vD" }
{ "attrC" : "vC", "attrD" : "vD" }
> db.collectionB.save(itemsB)
> db.collectionB.find()
{ "_id" : ObjectId("4e85de474808245ad59cc840"), "attrC" : "vC", "attrD" : "vD" }
> itemsB
{
"attrC" : "vC",
"attrD" : "vD",
"_id" : ObjectId("4e85de474808245ad59cc840")
}
从这里,我们可以看到save是更新和插入的包装器
在功能上,save和insert非常相似,尤其是在没有传递_id值的情况下。但是,如果传递了_id键,则save()将更新文档,而insert()将抛出重复键错误。可能重复的
> db.test.save
function (obj) {
if (obj == null || typeof obj == "undefined") {
throw "can't save a null";
}
if (typeof obj == "number" || typeof obj == "string") {
throw "can't save a number or string";
}
if (typeof obj._id == "undefined") {
obj._id = new ObjectId;
return this.insert(obj);
} else {
return this.update({_id:obj._id}, obj, true);
}
}
> db.test.insert
function (obj, _allow_dot) {
if (!obj) {
throw "no object passed to insert!";
}
if (!_allow_dot) {
this._validateForStorage(obj);
}
if (typeof obj._id == "undefined") {
var tmp = obj;
obj = {_id:new ObjectId};
for (var key in tmp) {
obj[key] = tmp[key];
}
}
this._mongo.insert(this._fullName, obj);
this._lastID = obj._id;
}