Mongodb:找到至少有一个数组元素匹配的文档?

Mongodb:找到至少有一个数组元素匹配的文档?

问题描述:

我有以下结构的文档:Mongodb:找到至少有一个数组元素匹配的文档?

[{ 
    "items": [ 
     { 
      "sent_to_lab": 123, 
      "received_from_lab": 456, 
     }, 
     { 
      "sent_to_lab": 123, 
     }, 
    ] 
} 
... more orders ... 
] 

我想取其中至少一个项下列条件匹配的所有订单:

'$and': [ 
    {'items.sent_to_lab': {'$exists': True}}, 
    {'items.received_from_lab': {'$exists': False}}, 
] 

因此,在这种情况下,我会喜欢返回上述项目,因为至少有一个items数组元素符合我的标准。

我该如何在mongo中做到这一点?

您需要使用$ elemMatch操作:

db.collection.find({items: 
        {$elemMatch:{ 
          sent_to_lab:{$exists:true}, 
          received_from_lab:{$exists:false}} 
}) 

这是查询$ elemMatch - 如果你只是想找回那种匹配的条件的项目(而不是与整个阵列整个文档)那么您可以同样使用投影$ elemMatch运算符。

+0

这非常有帮助,谢谢!在这种情况下,我确实需要整个文档。但似乎我现有的查询确保数组中的* all *元素与条件匹配,而不是实际上“一个或多个” – poundifdef 2013-03-02 03:26:30

+0

,这不是数组在MongoDB中的工作方式。您的查询表示返回任何子文档已发送到任何文档,并且任何子文档都没有received_from_lab。这意味着您的查询将返回包含两个子文档的文档,一个是已发送和已接收的文档,另一个是两个都没有(!)elemMatch将它们合并,以便它们应用于相同的子文档,这正是我理解您的用例的原因。 – 2013-03-02 12:45:55

+0

经过一番捣鼓之后,我发现你是对的,'$ elemMatch'正是我所期待的。非常感谢它。 – poundifdef 2013-03-04 19:42:12