【问题标题】:Mongo update while excluding certain fieldsMongo 更新同时排除某些字段
【发布时间】:2014-08-20 15:32:42
【问题描述】:

这听起来类似于 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 限制了在更新期间删除字段的能力。

这可以在查询中完成吗?没有 $unset?

【问题讨论】:

  • 当然 - 你可以在同一个查询中使用 $set 和 $unset - stackoverflow.com/questions/17760741/…
  • 很高兴知道,除非在某些情况下,我不知道要 $unset 哪些字段。我只知道新文档的外观,我需要忽略某些字段。可以查找以前的文档并进行比较,但会降低性能。
  • 是的 - 听起来您正在尝试执行 mongo 不直接支持的相当复杂的操作。

标签: mongodb mongodb-query mongodb-php mongodb-update


【解决方案1】:

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

> 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 文档并有效更新某些字段,同时默认删除某些字段并保留其他字段。

【讨论】:

  • 嘿,对于这个问题,这是一个非常好的答案,也是处理它的聪明方法。不幸的是,我现在无法实现它,因为我已经有很多文档,并且其他部分代码依赖于我当前的格式。重写将花费太长时间。如果我可以从头开始设计,那肯定会很有用。
【解决方案2】:
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});

【讨论】:

    猜你喜欢
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2023-04-09
    相关资源
    最近更新 更多