> 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")
}
以下是我的观察:
插入 collectionA 后, itemsA 的值不会被修改。
相比之下,存储到 collectionB 后, itemB 的值会发生变化!
是否有任何规则可以指导这些修改,以便我知道在将值插入或保存到集合后应该注意什么?
谢谢
答案 0 :(得分:3)
对于保存,如果您提供_id,它将会更新。如果不这样做,它将插入。关于Mongo的JavaScript shell的一个简洁的功能是,如果你在没有执行parentesis的情况下调用函数,它将返回实现。如果您对MongoDB的任何方法感到好奇并且不想整理所有源代码,这非常有用!
在JS shell中:
> 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;
}
由此可以看出,save是更新和插入的包装器。
在功能上,save和insert非常相似,特别是如果没有传递_id值。但是,如果传递了_id键,save()将更新文档,而insert()将抛出重复键错误。
答案 1 :(得分:2)
对于保存,如果您提供_id,它将会更新。如果你不这样做,它会插入,这就是差异。