我有一个有一个文件的收藏夹。看起来像这样:
words: {
wordOne: ["Cat", "Dog","Fish"],
wordTwo: ["Red", "Blue", "Green"],
wordThree: ["Square","Cirecle","Triangle"]
}
我想查询数据库以选择随机密钥(wordOne
,wordTwo
或wordThree
)然后返回一个随机词从该键上的数组中。
到目前为止,我已经编写了一个查询,该查询返回了整个文档,然后使用JS选择一个随机键,然后选择一个随机词。当然可以,但是我读过,如果您可以让数据库来完成工作,那么最好这样做。另外我真的很好奇它将如何实现。
我正在使用Node和猫鼬
答案 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 }
}
])
答案 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
}
}
])