1

这听起来类似于 Mongo $set。在这种情况下,我想更新文档(更新和/或删除字段),但忽略字段 creatorName,使其保持不变。

示例文档:

{id: 1, firstName: 'Testy', middleName: 'Jim', lastName: 'Shorts', creatorName: 'User1'}

更新为:

{id: 1, firstName: 'Production', lastName: 'Pants', creatorName: 'User1'}

如果我使用 set,creatorName 保持不变(好)并且 firstName 和 lastName 被更新(好),但 middleName 没有被删除(坏)。Set 限制在更新期间删除字段的能力。

这可以在查询中完成吗?没有$未设置?

4

2 回答 2

1

听起来可能会有更复杂的事情发生,但你只是在评论中暗示过,所以我真的不能说话。但是,有一种很好的方法可以对名称情况做您想做的事情。将名称字段存储为嵌入对象并更新对象:

> db.characters.findOne()
{
    "_id" : ObjectId("53f6293de062d5cdbec6553e"),
    "creatorName" : "Stan Smalls",
    "name" : {
        "first" : "Jack",
        "middle" : "B",
        "last" : "Quick"
    }
}
> db.characters.update({ "_id" : ObjectId("53f6293de062d5cdbec6553e") },
    { "$set" : {
        "name" : {
            "first" : "Sam",
            "last" : "Slow"
            }
        }
    }) 
> db.characters.findOne()
{
    "_id" : ObjectId("53f6293de062d5cdbec6553e"),
    "creatorName" : "Stan Smalls",
    "name" : {
        "first" : "Sam",
        "last" : "Slow"
    }
}

您可能能够应用于更复杂案例的更大原则是将需要更新的字段与需要在嵌入式文档中更新相关字段时需要删除的字段组合在一起,这样您就可以重新$set编写文档和有效地更新某些字段,同时默认删除某些字段并保留其他字段。

于 2014-08-21T17:24:46.207 回答
0
const a = {
    id: 1,
    firstName: 'Testy',
    middleName: 'Jim',
    lastName: 'Shorts',
    creatorName: 'User1'
}

const b = {
    id: 1,
    firstName: 'Production',
    lastName: 'Pants',
    creatorName: 'User1'
}

delete b["id"];
// Maybe this..
delete b["_id"];

db.User.updateOne({id: 1}, {"$set": b});
于 2021-12-21T02:19:30.987 回答