我在mongoose中定义了两个模式,如下所示,
型号:文章
var articleSchema = new mongoose.Schema({ sequenceId:String 标题:字符串, abstract:String, 作者:[String], …
我认为你可以使用聚合管道实现你想要的东西。
获取所有包含'wordAbc'和/或'wordXyz'的文章 selectedWord,preferredWord或同义词 醇>
首先,您需要填充所有单词 details 现场 words 数组,然后匹配基于的文章 selectedWord , preferredWord 要么 synonyms 。
details
words
selectedWord
preferredWord
synonyms
这可以像这样:
Article.aggregate([{ $unwind : "$words" },{ $lookup : { from : "words", localField : "words.details", foreignField : "_id", as : "words.details" } },{ $unwind : "$words.details" },{ $match : { $or : [{ "words.selectedWord" : {$in: ['wordAbc', 'wordXyz']} },{ "words.details.preferredWord" : {$in: ['wordAbc', 'wordXyz']} },{ "words.details.synonyms" : {$in: ['wordAbc', 'wordXyz']} }] } },{ $group : { _id : "$_id", title : {$first : "$title"}, abstract : {$first : "$abstract"}, authors : {$first : "$authors"}, date : {$first : "$date"}, words: {$push : "$words"}, otherTags: {$first : "$otherTags"} } }])
获取selectedWord,preferredWord和同义词中的所有唯一单词 跨数据库中的所有文章 醇>
在这种情况下,你将不得不 unwind words 数组然后 populate words.details 从 words 收集,然后 unwind synonyms 数组,这样我们就可以创建一组了 selectedWord , preferredWord 和 synonyms 所有的 articles ,然后最后在聚合管道的最后阶段制作一整套所有独特的单词。
unwind
populate
words.details
articles
这可以这样实现:
Article.aggregate([{ $project : { words : "$words" } },{ $unwind : "$words" },{ $lookup : { from : "words", localField : "words.details", foreignField : "_id", as : "words.details" } },{ $unwind : "$words.details" },{ $unwind : "$words.details.synonyms" },{ $project : { selectedWord : "$words.selectedWord", preferredWord : "$words.details.preferredWord", synonyms : "$words.details.synonyms" } },{ $group : { _id : "null", selectedWord : {$addToSet :"$selectedWord"}, prefferedWord : {$addToSet :"$prefferedWord"}, synonyms : {$addToSet :"$synonyms"} } },{ $project : { commonWords : {$setUnion : ["$selectedWord","$prefferedWord","$synonys"]} } }])
第二次聚合的说明。
$project
$unwind
$lookup
words.details.synonyms
{ words : { selectedWord :"someword", details : { preferredWord : "otherword", synonym : "synonymword" } } }
{ selectedWord :"someword", preferredWord : "otherword", synonym : "synonymword" }
$group :结合所有 selectedWord 成一个数组, preferredWord 在一个数组中,同义词在一个数组中,$ addToSet用于删除重复的对象
$group
$project :组合所有3个数组并创建一个独特的单词数组
有关mongoDB所有已使用运算符的详细信息,请阅读相应的文档。
$ setUnion文档
$ addToSet文档
$项目文档
$ unwind文档
mongodb聚合管道的所有运营商的文档
我希望这可以帮助你