如何将每个数组字段与Mongodb中的其他字段匹配

时间:2019-12-29 11:44:30

标签: mongodb mongoose

我有一个如下数组:

const test = [{
    "_id": 1,
    "name": "apple",
    "car": "ford"
},{
    "_id": 2,
    "name": "melon",
    "car": "ferrari"
},{
    "_id": 3,
    "name": "perl",
    "car": "Renaut"
}]

Mongodb的文档如下:

[{
  "name": "perl", "company": "A"
},{
  "name": "melon", "company": "B"
},{
  "name": "apple", "company": "C"
},{
  "name": "apple", "company": "D"
},{
  "name": "perl", "company": "E"
},{
  "name": "apple", "company": "F"
}]

我想使用mongodb聚合获得此结果:

[{
  "name": "perl", "company": "A", testInform: { "_id": 3, "name": "perl", "car": "Renaut"}
},{
  "name": "melon", "company": "B", testInform: { "_id": 2, "name": "melon", "car": "ferrari"}
},{
  "name": "apple", "company": "C", testInform: { "_id": 1, "name": "apple", "car": "ford"}
},{
  "name": "apple", "company": "D", testInform: { "_id": 1, "name": "apple", "car": "ford"}
},{
  "name": "perl", "company": "E", testInform: { "_id": 3, "name": "perl", "car": "Renaut"}
},{
  "name": "apple", "company": "F", testInform: { "_id": 1, "name": "apple", "car": "ford"}
}]

我认为将聚合与$match$facet等一起使用,但是我不知道该怎么做。您能为此推荐一个解决方案吗?

非常感谢您阅读本文。

3 个答案:

答案 0 :(得分:0)

$ lookup 和管道关键字

db.demo2.aggregate(
    {
      $lookup:
         {
           from: "demo1",
           let: { recordName: "$name"},
           pipeline: [
              { $match:
                 { $expr:
                    { $and:
                       [
                         { $eq: [ "$$recordName",  "$name" ] },
                       ]
                    }
                 }
              },
           ],
           as: "testInform"
         }

    }
    )

答案 1 :(得分:0)

如果random_draws <- numeric() for(i in 1:1000000) random_draws[i] <- nextEventTime(0) length(which(random_draws > 195)) # > [1] 28 数组数据存储在集合中,则通过$lookup聚合来轻松进行{​​{3}}的O / P

$project为什么?因为查找将以test

的形式获取数组中的合并文档。
testInform

根据评论进行更新:

想法是从存储在mongodb $arrayElemAt中的文档中cursor进行迭代,将db.maindocs.aggregate([ { $lookup: { from: "testdocs", localField: "name", foreignField: "name", as: "testInform" } }, { $project: { _id: 0, name: 1, company: 1, testInform: { $arrayElemAt: ["$testInform", 0] } } } ]); 中与test字段匹配的对象添加到结果中。

name

答案 2 :(得分:0)

聚合有一个阶段:遍历test数组,并将数组元素作为与文档和数组中的name字段都匹配的对象(使用$reduce运算符)。

const test = [ { ... }, ... ]

db.test_coll.aggregate( [
  { 
      $addFields: { 
          testInform: { 
              $reduce: {
                  input: test,
                  initialValue: { },
                  in: {
                      $cond: [ { $eq: [ "$$this.name", "$name" ] }, 
                               { $mergeObjects: [ "$$this", "$$value" ] }, 
                               "$$value"
                             ]
                      }
               }
          }
      }
  }
] )