在MongoDB中使用$match和$and

56

我想在MongoDB中使用以下查询,但它不起作用。

  db.test.aggregate(
    $match: {
      $and: [
        type: { $in: ["TOYS"] },
        type: { $nin: ["BARBIE"] },
        time: { $lt: ISODate("2013-12-09T00:00:00Z") }
      ]
    }
  })

它说存在无效字符 ":"。

是否可以在 $match 中使用 $and?我在这个论坛上看到了一个 $or 和 $match 的例子,所以我认为这是可能的。

感谢您提前的帮助和指导。


文档在此处:http://docs.mongodb.org/manual/reference/operator/aggregation/match/ - Bud Damyanov
谢谢回复。我了解到在查询中不需要使用$and,因为它已经被隐含了? - Manus
3
这是一个在不使用聚合框架的情况下可以完美工作的查询,使用普通的查找命令即可。 - Maximiliano Rios
我同意Maximiliano Rios的观点,请阅读http://docs.mongodb.org/manual/reference/method/db.collection.find/。 - Bud Damyanov
7
为什么建议他使用其他东西,而不是帮助解决他的问题?也许我们所看到的只是他全部聚合体的一小部分? - Daniel W.
4个回答

114

$and 与 $match 一起使用的效果很好。

您的查询存在语法错误。尝试使用以下代码。

db.test.aggregate([
                   { 
                     $match: {
                          $and: [ 
                              {type: {$in: ["TOYS"]}}, 
                              {type: {$nin: ["BARBIE"]}}, 
                              {time: {$lt:ISODate("2013-12-09T00:00:00Z")}}
                          ]
                     }
                   }
                  ])

而对于您尝试做的事情,您不需要使用 $and


2
嗨Ajai......谢谢你的纠正。是的,我发现$and不是必需的。感谢大家的帮助。 - Manus
2
在这种情况下,使用$and是否不必要?至少在MongoDB 3.2+中似乎是这样的。 - Doguhan Uluca
4
可以。这里的$and是多余的。我们使用它来回答问题:“是否可以在$match中使用$and?” - 4J41
3
我认为$and$match中并不完全多余...或许在最简单的情况下是可以省略的...我先尝试了两个独立的$expr条件来直接筛选,但没有得到正确的结果...必须加上$and才能正确地组合比较(版本3.6.2)。 - Gene M
1
在按顺序构建匹配表达式并且同一参数有多个条件的情况下,使用$match表达式中的$and可以非常方便。 - Zitoun

9
{
  $match: {
    $or:[
      {'sender':sender, 'recipient':recipient},
      {'recipient':sender,'sender':recipient}
    ]
  }
}

使用$or

7
db.test.find( {$and: [ {"type": {$in: ["TOYS"]}}, 
                       {"type": {$nin: ["BARBIE"]}}, 
                       {"time": {$lt:ISODate("2013-12-09T00:00:00Z")}}
                     ]
})

AND 与 FIND 结合使用,接收匹配项的数组(但它不是一个匹配指令) 聚合框架用于完全不同的东西,就像这个词所说的,用于聚合(计数、求和、平均值等分组或展开等)


感谢你的回答,Maximiliano。我使用聚合是因为在匹配这些记录后,我需要按userID进行分组。抱歉没有完整描述问题。所以我认为在聚合中不能使用$and了.... - Manus
4
您可以在聚合操作中使用$and,但您不必显式地编写它。通过使用不同的过滤器,它是隐含的。实际上,如果这些过滤器中的一个需要不同的解决方案,您可以将它们管道传输。 - Maximiliano Rios
3
$match 接受 { <query> } 作为参数。这意味着它可以很好地接受 $and - J.Wells

1

$lookup和$match的示例

db.orders.aggregate([
  {
    "$lookup": {
      "from": "user",
      "localField": "user",
      "foreignField": "_id",
      "as": "user"
    }
  },
  {
    "$unwind": "$user"
  },
  {
    "$match": {
      "$and": [
        {
          "privacy.mode": {
            "$gt": 0
          }
        },
        {
          "user.privacy.mode": {
            "$gt": 0
          }
        }
      ]
    }
  }
])
``

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接