【问题标题】:MongoDB issue with updating nested few times object更新嵌套几次对象的 MongoDB 问题
【发布时间】:2018-03-07 17:24:24
【问题描述】:

大家好,我在使用 Meteor / Mongo 更新集合中的键值时遇到问题

data: {
      'id': id,
      'fb_id': fbId,
      'name': fbName,
      'access_token': fbAccessToken,
      'symbol': fbSymbol,
      'config': {
        'get_started': {
          'payload': getStarted
        },
        'persistent_menu': [
          {
            'locale': 'default',
            'call_to_actions': [
              {
                'type': 'postback',
                'title': persistentMenu1,
                'payload': 'menu'
              },
              {
                'type': 'postback',
                'title': persistentMenu2,
                'payload': 'knowledge_base'
              },
              {
                'type': 'nested',
                'title': persistentMenu3,
                'call_to_actions': [
                  {
                    'type': 'postback',
                    'title': nestedPersistentMenu1,
                    'payload': 'subscription'
                  },
                  {
                    'type': 'postback',
                    'title': nestedPersistentMenu2,
                    'payload': 'tth'
                  }
                ]
              }
            ],
            'composer_input_disabled': false
          },
          {
            'locale': 'pl_PL',
            'call_to_actions': [
              {
                'type': 'postback',
                'title': persistentMenu1,
                'payload': 'menu'
              },
              {
                'type': 'postback',
                'title': persistentMenu2,
                'payload': 'knowledge_base'
              },
              {
                'type': 'nested',
                'title': persistentMenu3,
                'call_to_actions': [
                  {
                    'type': 'postback',
                    'title': 'Subskrypcja',
                    'payload': 'subscription'
                  },
                  {
                    'type': 'postback',
                    'title': 'Konsultant',
                    'payload': 'tth'
                  }
                ]
              }
            ],
            'composer_input_disabled': false
          }
        ],
        'greeting': [
          {
            'locale': 'default',
            'text': somethingNew
          },
          {
            'locale': 'pl_PL',
            'text': greetingsText
          }
        ]
      },
      'created_at': '2017-06-05T06:00:37.759455Z',
      'updated_at': updatedAt
    }
  })

我需要获取“greeting”数组中的第二个元素并更改“text”的值,即“greetingsText”

我尝试通过在浏览器中使用控制台输入此代码来执行此操作

Collection.update({_id: "some_id"}, {$set: {fanpageInfo: {config: {"greeting.2": {text: "tata"}}}}}) but it doesnt work unfortunately

有错误提示“更新失败:

MongoError: The dotted field 'greeting.2' in 'fanpageInfo.config.greeting.2' is not valid for storage." 

老实说,我不确定我是否正确定位它 - 我检查了文档并询问了谷歌,但只有简单的教程。

提前感谢您的帮助

【问题讨论】:

  • fanpageInfo 字段在哪里?
  • 实际上有fanpageInfo而不是data
  • 检查我的答案。它适用于我的查询,您可以将其复制粘贴到 Meteor 查询中,它工作正常。

标签: javascript mongodb meteor


【解决方案1】:

查找查询:

您需要通过以下链接:

特定流星find-nth-element-of-array-in-mongo-collection-meteor

Mongo 特定 get-n-th-element-of-an-array-in-mongodb

简单的找到你需要使用slice就像ChatRooms.findOne( {}, { chatIds: { $slice: 1 } } );

更新查询

你可以试试

Collection.update({_id: "some_id"}, {$set: {'config.greeting.1.text': 'tata'}});

如果有像fanpageInfo 这样的东西作为config 的父字段,那么更新查询应该是Collection.update({_id: "some_id"}, {$set: {'fanpageInfo.config.greeting.1.text': 'tata'}});

我在 mongodb 中运行了您的上述数据,它适用于上述查询。图片在下方

更多:Click Here

【讨论】:

  • 非常感谢您的帮助!赞赏
  • 是的,伙计,我也学会了以后怎么做:)我很想给你一个点来回答,但是我的水平很低
  • 也永远不要因为分数而失去动力,只是向前看,回答和帮助他人,提出奇妙/愚蠢的问题并不重要。我也从你的问题中学到了一些新东西。所以这是双赢的局面。让他人的生活变得轻松而鼓舞人心。我也是从ZERO开始的。所以不要打扰,快乐并在这里提供帮助。 Stackoverflow 对@Styx、@jankapankt、@michel floyd、@mikkel 等人有很大帮助,我知道他们会立即无条件地解决问题,我从他们身上学到了无条件和谦虚。所以飞得很高:)
【解决方案2】:

首先,您的 greeting 数组只有 2 个元素,因此通过使用 greeting.2 您正在尝试修改 第三个​​ 元素(从零开始的索引)。

其次,您应该使用dot notation 只修改一个特定字段:

{ $set: { "fanpageInfo.config.greeting.1.text": "tata" } }

在此更新中,我已将 2 更改为 1。如果您尝试改用 2 — 它将在数组中创建另一个文档,其中仅包含 text: "tata"

【讨论】:

  • 它不起作用。如果我没有留下任何未知的东西,就没有像fanpageInfo 这样的东西。
  • @AnkurSoni 问题作者确实告诉过那件事:“实际上有 fanpageInfo 而不是数据”,所以我只是假设他的查询是正确的,而不是他的示例数据。
  • 可以是场景。
  • 这就是解决方案!非常感谢伙计!高度赞赏
  • @Rachomir 很高兴它有帮助 :) 不要忘记接受我的回答。
猜你喜欢
  • 2021-02-13
  • 2021-01-23
  • 1970-01-01
  • 2018-11-07
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
相关资源
最近更新 更多