Mongodb 从ID数组中查找第一个匹配的文档

Mongodb 从ID数组中查找第一个匹配的文档,mongodb,mongoose,nosql,mongodb-query,aggregation-framework,Mongodb,Mongoose,Nosql,Mongodb Query,Aggregation Framework,假设我在一个集合包中有以下文档: { _id: "animals"} { _id: "sillyanimals", extends: ["animals"] } 这些文件是另一种收集方式: { _id: 1, thing: "dog", pack: "animals", bark: true, silly: false} { _id: 2, thing: "cat", pack: "animals", bark: false, silly: false } { _id: 3, thing: "

假设我在一个集合包中有以下文档:

{ _id: "animals"}
{ _id: "sillyanimals", extends: ["animals"] }
这些文件是另一种收集方式:

{ _id: 1, thing: "dog", pack: "animals", bark: true, silly: false}
{ _id: 2, thing: "cat", pack: "animals", bark: false, silly: false }
{ _id: 3, thing: "dog", pack: "sillyanimals", silly: true }
我怎么能用一个简单的问题从一群愚蠢的动物那里得到猫?它应该返回id_2,因为sillyanimals扩展了动物


另外,当我在sillyanimals包中搜索一只狗时,如何得到一个将id_1和id_3与单个查询相结合的结果?_3的属性应优先,并覆盖_1的属性。

您可以尝试使用以下cat查询:

db.getCollection('packs').aggregate([
{
   $lookup:
     {
       from: 'things',
       localField: 'extends',
       foreignField: 'pack',
       as: "inherited"
     }
}
,{$unwind:"$inherited"}
,{$match:{"inherited.thing":"cat"}}    //1)Set "dog"
,
{
   $lookup:
     {
       from: 'things',
       localField: '_id',
       foreignField: 'pack',
       as: "content1"
     }
}
,{$unwind:"$content1"}

,{
         $project:
           {

             properties:
               {

                   $cond: {
                        if: {
                          $eq: ['$content1.thing', "cat"]   //2)set dog
                        },
                        then: "$content1",
                        else: "$inherited",
                      }
               }
           }
}

])
如果搜索狗,请更改1和2中的参数