MongoDB 使用另一个集合数组对文档进行排序

Posted

技术标签:

【中文标题】MongoDB 使用另一个集合数组对文档进行排序【英文标题】:MongoDB sort documents using another collection array 【发布时间】:2019-10-28 04:02:06 【问题描述】:

我会尽力解释我想要达到的目标。

(注意:_id 是自动生成的)

让我们从我要查询的架构开始

cocktail: Schema = 
    name:  type: String ,
    ingredients: [ type: ObjectId, ref: 'ingredient', required: true ]

简单地说,名称是鸡尾酒的名称,成分是构成鸡尾酒的元素。

为简单起见,这是成分模式

ingredient: Schema = 
    name:  type: String 

简单干净。

假设我有一个用户集合,用户可以在其中选择自己喜欢的成分。用户的成分可以为空。

user: Schema = 
    name:  type: String ,
    preferredIngredients: [ type: ObjectId, ref: 'ingredient' ]

现在的问题是:是否可以通过用户最喜欢的成分来查询鸡尾酒系列?

我试过了(me 是以前的查询来查找用户)

db.cocktails.find( ingredients:  $in: [me.preferredIngredients] )

但它从不返回数据。我对 mongo 或 mongooose 进一步挖掘的经验不是很好

请帮忙!

【问题讨论】:

假设一切正常 - $in: [me.preferredIngredients] - 尝试去掉方括号。 me.preferredIngredients 已经是一个数组,您正在以这种方式创建一个数组数组。 @Anton 谢谢。我没想到。 【参考方案1】:

是的,有可能,你应该使用$lookup mongo version 3.6+ 语法:

db.users.aggregate([
   
     $lookup: 
       from: "cocktails",
       let:  ingredients: "$preferredIngredients" ,
       pipeline: [ 
             $match:
                  $expr:
                     $setIsSubset : ["$ingredients", "$$ingredients"],
                 
              
       ],
       as: 'matched_cocktails'
     
   
])

【讨论】:

嗯,这给了我所有用户和所有与他们喜欢的成分相匹配的鸡尾酒。我将以您的代码为例来使我的代码正常工作。谢谢,你太棒了。 没问题,显然您可以在查找之前轻松添加匹配阶段以仅过滤相关用户。

以上是关于MongoDB 使用另一个集合数组对文档进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MongoDB 中对集合记录中的数组进行排序?

如何选择然后对 MongoDB 文档进行排序,然后找到下一个要挖掘的文档?

如何选择然后对 MongoDB 文档进行排序,然后找到下一个要挖掘的文档?

MongoDB:如何为集合中的每个文档设置一个等于另一个字段值的新字段[重复]

MongoDB:对文档集进行设置操作,如何操作?

如何在 MongoDB 中按日期对集合进行排序?