【问题标题】:Pull an item from all arrays MongoDB从所有数组MongoDB中拉出一个项目
【发布时间】:2021-10-10 22:00:46
【问题描述】:

idk 如果这是可能的但需要一些关于 mongo 的帮助,我有以下文档,我想制作它,以便我可以使用 $addToSetvotes 中的项目之一添加值,但删除votes 中所有其他项目中的该项目,但不知道如何

{
  _id: '872952643117518909',
  questions: [
    { question: 'a', number: 1, dropDownInfo: [Object] },
    { question: 'b', number: 2, dropDownInfo: [Object] },
    { question: 'c', number: 3, dropDownInfo: [Object] }
  ],
  votes: {
    '1': [ '619284841187246090', '662697094104219678' ],
    '2': [ '619284841187246090', '662697094104219678' ],
    '3': [ '662697094104219678', '619284841187246090' ]
  },
  question: 'abc',
  timestamp: 1628198528903,
  finished: false,
  channel: '812038854302892064'
}

【问题讨论】:

    标签: javascript node.js mongodb discord discord.js


    【解决方案1】:

    波纹管向特定字段添加投票('619284841187246090'),这里随机选择“2”,并从“1”和“3”数组中删除该投票。

    解决方案是通用的,可以使用任何投票字段,而不仅仅是“1”“2”“3”。

    您可以在聚合中使用此管道或使用管道更新 (Mongodb>=4.2)

    $addToSet 在数组中不起作用,它在分组和 在 MongoDB 5 的其他一些地方。

    我认为您的架构有问题,因为您将数据保存在架构中,这使得查询和创建索引更加困难等。

    但我们仍然可以将对象转换为数组并返回对象。

    我认为最好将数据保存在数组中,并将字段作为已知模式。

    你可以运行下面的代码here

    查询

    db.collection.aggregate( [ {
        "$addFields" : {
          "votes" : {
            "$arrayToObject" : {
              "$map" : {
                "input" : {
                  "$map" : {
                    "input" : {
                      "$objectToArray" : "$votes"
                    },
                    "as" : "m",
                    "in" : [ "$$m.k", "$$m.v" ]
                  }
                },
                "as" : "vote",
                "in" : {
                  "$cond" : [ {
                    "$eq" : [ {
                      "$arrayElemAt" : [ "$$vote", 0 ]
                    }, "2" ]
                  }, [ {
                    "$arrayElemAt" : [ "$$vote", 0 ]
                  }, {
                    "$cond" : [ {
                      "$in" : [ "619284841187246090", {
                        "$arrayElemAt" : [ "$$vote", 1 ]
                      } ]
                    }, {
                      "$arrayElemAt" : [ "$$vote", 1 ]
                    }, {
                      "$concatArrays" : [ {
                        "$arrayElemAt" : [ "$$vote", 1 ]
                      }, [ "619284841187246090" ] ]
                    } ]
                  } ], [ {
                    "$arrayElemAt" : [ "$$vote", 0 ]
                  }, {
                    "$filter" : {
                      "input" : {
                        "$arrayElemAt" : [ "$$vote", 1 ]
                      },
                      "as" : "v",
                      "cond" : {
                        "$not" : [ {
                          "$eq" : [ "$$v", "619284841187246090" ]
                        } ]
                      }
                    }
                  } ] ]
                }
              }
            }
          }
        }
      } ])
    

    结果

    [
      {
        "_id": "872952643117518909",
        "channel": "812038854302892064",
        "finished": false,
        "question": "abc",
        "questions": [
          {
            "dropDownInfo": "",
            "number": 1,
            "question": "a"
          },
          {
            "dropDownInfo": "",
            "number": 2,
            "question": "b"
          },
          {
            "dropDownInfo": "",
            "number": 3,
            "question": "c"
          }
        ],
        "timestamp": 1.628198528903e+12,
        "votes": {
          "1": [
            "662697094104219678"
          ],
          "2": [
            "619284841187246090",
            "662697094104219678"
          ],
          "3": [
            "662697094104219678"
          ]
        }
      }
    ]
    

    【讨论】:

      猜你喜欢
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 2016-08-03
      • 2015-10-29
      相关资源
      最近更新 更多