【问题标题】:How to call $addToSet if an array exists if it doesnt then call $set in one query?如果数组存在则如何调用 $addToSet 如果它不存在然后在一个查询中调用 $set?
【发布时间】:2013-08-15 05:44:26
【问题描述】:

嘿,所以我正在尝试设置一个 mongodb 文档中不存在的新数组,但我希望能够在不不断替换值的情况下将其他文档放入数组中。

例如:

users {
    id: 'value1',
    name: {value2},
    friends: [
               {friendID: 'value x', type: 'valuey', TAGS: [tag1, tag2]}

             ]

基本上 TAGS 不存在,我想创建它并添加 tag1,如果它确实存在,我只想将 tag2 添加到数组中...

这是为了让上面示例中的变量与我的数据库中的变量有关:

friendStatus = friends,
fuId = friendID,
labels = TAGS

这是我的尝试:

Friend.findOneAndUpdate({userId: mongoose.Types.ObjectId(req.signedCookies.userid), 
'friendStatus.fuId': mongoose.Types.ObjectId(req.body.user)}, 
{$addToSet: {'friendStatus.$.labels': req.body.labelNew}}
    , function(err, userX) {    


}

【问题讨论】:

  • 您的字段名称似乎不正确,因此查询与您提供的示例文档不匹配。请在尝试更新之前尝试运行查询以确保其正常工作。
  • 嘿,如果数组存在,则查询有效,否则我需要调用 $set...friendStatus 在示例顶部文档中是 (friends),标签是 (TAGS),fuId 是 ( id)...如果我使用 $set 首先创建数组然后将其更改为 $addToSet 来运行它(因为此时数组存在。)

标签: node.js mongodb mongoose


【解决方案1】:

目前没有办法用 MongoDB 更新语法做你想做的事。

这里有一个允许类似的功能:https://jira.mongodb.org/browse/SERVER-6566

【讨论】:

    【解决方案2】:

    您应该使用“upsert”标志:

    Friend.update({userId: req.signedCookies.userid, 'friendStatus.fuId': req.body.favourites}, {$addToSet: {'friendStatus.$.labels': req.body.labelNew}}, {upsert:true},函数(错误,项目){ ... })

    但是,'friendStatus.$.labels' 是说“我有多个friendStatus,我希望此操作适用于我的查询匹配的任何/所有它们”(至少,afaict)——所以我'我不肯定这对你有用。http://docs.mongodb.org/manual/reference/operator/positional/(另请参阅http://docs.mongodb.org/manual/core/update/ 的 upsert 标志)

    【讨论】:

    • 这行不通,因为您不能将位置运算符 ($) 与 upsert 混合使用,因为在插入时它没有任何东西可以替换“$”,因此您会得到一个名为“$”的字段。
    • 是的,正如我所说的(至少在 IRC 上),位置运算符有点混乱,但这是做他需要做的事情的方式。我认为更好的解决方案是避免使用位置运算符,因为它实际上在这里似乎并不合适。适当的做法是对他实际寻找的子文档进行操作。但是这里的问题实际上是“如何将 $addToSet 用于尚不存在的数组字段?”答案是 upsert。
    猜你喜欢
    • 1970-01-01
    • 2014-10-13
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    相关资源
    最近更新 更多