从mongoDB中的数组返回随机键和单词

时间:2020-06-29 04:22:14

标签: node.js mongodb mongoose

我有一个有一个文件的收藏夹。看起来像这样:

 words: {
   wordOne: ["Cat", "Dog","Fish"],
   wordTwo: ["Red", "Blue", "Green"],
   wordThree: ["Square","Cirecle","Triangle"]
 }

我想查询数据库以选择随机密钥wordOnewordTwowordThree然后返回一个随机词从该键上的数组中

到目前为止,我已经编写了一个查询,该查询返回了整个文档,然后使用JS选择一个随机键,然后选择一个随机词。当然可以,但是我读过,如果您可以让数据库来完成工作,那么最好这样做。另外我真的很好奇它将如何实现。

我正在使用Node和猫鼬

2 个答案:

答案 0 :(得分:1)

您可以使用$reduce$objectToArray$concatArrays来变换words对象中包含的所有数组。这将为您提供所有字符串的一个长数组,然后可以将其作为参数传递给$unwind,以使每个文档得到一个单词。最后,您可以运行$sample来获取随机文档:

db.collection.aggregate([
    {
        $project:{
            all: {
                $reduce: {
                    input: { $objectToArray: "$words" },
                    initialValue: [],
                    in: { $concatArrays: [ "$$value", "$$this.v" ] }
                }
            }
        }
    },
    {
        $unwind: "$all"
    },
    {
        $project: {
            _id: 0,
            sampleWord: "$all"
        }
    },
    {
        $sample: { size: 1 }
    }
])

Mongo Playground

答案 1 :(得分:1)

替代解决方案:

db.collection.aggregate([
  {
    $project: {
      words: {
        $reduce: {
          input: {
            $objectToArray: "$words"
          },
          initialValue: [],
          in: {
            $concatArrays: [
              "$$value",
              {
                $map: {
                  input: "$$this.v",
                  as: "w",
                  in: {
                    key: "$$this.k",
                    word: "$$w"
                  }
                }
              }
            ]
          }
        }
      }
    }
  },
  {
    $unwind: "$words"
  },
  {
    $replaceWith: "$words" // For MongoDB v3.4 $replaceRoot:{newRoot:"$words"}
  },
  {
    $sample: {
      size: 1
    }
  }
])

MongoPlayground