MongoDB:如何匹配数组的元素?

时间:2018-01-04 05:22:31

标签: mongodb match lookup

我有两个集合如下:

db.qnames.find()
{ "_id" : ObjectId("5a4da53f97a9ca769a15d49e"), "domain" : "mail.google.com", "tldOne" : "google.com", "clients" : 10, "date" : "2016-12-30" }
{ "_id" : ObjectId("5a4da55497a9ca769a15d49f"), "domain" : "mail.google.com", "tldOne" : "google.com", "clients" : 9, "date" : "2017-01-30” }

db.dropped.find()
{ "_id" : ObjectId("5a4da4ac97a9ca769a15d49c"), "domain" : "google.com", "dropDate" : "2017-01-01", "regStatus" : 1 }

我想加入这两个系列,然后选择' dropDate'字段(来自已删除的集合)大于' date'提交(来自qnames字段)。所以我使用了以下查询:

 db.dropped.aggregate( [{$lookup:{ from:"qnames", localField:"domain",foreignField:"tldOne",as:"droppedTraffic"}},
     {$match: {"droppedTraffic":{$ne:[]}  }}, 
{$unwind: "$droppedTraffic" } , 
{$match: {dropDate:{$gt:"$droppedTraffic.date"}}} ])

但是此查询不会过滤dropDate<的记录。日期。任何人都可以告诉我它为什么会发生?

2 个答案:

答案 0 :(得分:1)

您应该使用$redact来比较同一文档的两个字段。以下示例应该有效:

db.dropped.aggregate( [
    {$lookup:{ from:"qnames", localField:"domain",foreignField:"tldOne",as:"droppedTraffic"}},
    {$match: {"droppedTraffic":{$ne:[]}  }}, 
    {$unwind: "$droppedTraffic" }, 
    {
        "$redact": {
            "$cond": [
                { "$lte": [ "$dropDate", "$droppedTraffic.date" ] },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

答案 1 :(得分:1)

您没有获得记录的原因是

  

日期在集合中用作字符串,以利用比较运算符获取所需结果,使用new ISODate("your existing date in the collection")修改集合文档

请注意,即使修改了两个集合,您也需要修改聚合查询,因为在最终的$ match查询中,已经比较了同一文档中的两个值。

获取所需文档的示例查询

db.dropped.aggregate([ 
    {$lookup: { 
       from:"qnames", 
       localField:"domain", 
       foreignField:"tldOne", 
       as:"droppedTraffic"}
    },
    {$project: {
       _id:1, domain:1, 
       regStatus:1,
       droppedTraffic: {
          $filter: { 
             input: "$droppedTraffic", 
             as:"droppedTraffic", 
             cond:{ $gt: ["$$droppedTraffic.date", "$dropDate"]}
          }
       }
     }} 
])

在上面给出的这种方法中,我们使用$filter来避免$unwind操作