PhpMongo - 如何对数组中存在的单个文档应用AND条件?

时间:2015-12-16 14:23:49

标签: php mongodb

我的Mongo系列有两个文件

masterfilesales <- bind_rows(file.list, .id="id") %>% mutate(id = substr(id,1,4))

这是我用来获取的查询,只有当user_id为2&amp;状态为“UNSEEN”。

{  
   "_id":ObjectId("567168393d5c6cd46a00002a"),
   "type":"SURVEY",
   "description":"YOU HAVE AN UNANSWERED SURVEY.",
   "user_to_notification_seen_status":[  
      {  
         "user_id":1,
         "status":"UNSEEN",
         "time_updated":1450272825
      },
      {  
         "user_id":2,
         "status":"SEEN",
         "time_updated":1450273798
      },
      {  
         "user_id":3,
         "status":"UNSEEN",
         "time_updated":1450272825
      }
   ],
   "feed_id":1,
   "time_created":1450272825,
   "time_updated":1450273798
}

理想情况下,上述查询不应检索结果,但会返回结果。如果我提供无效ID或无效状态,则不会返回任何记录。

2 个答案:

答案 0 :(得分:0)

您误解了查询的工作原理。它与您的文档匹配,因为user_to_notification_seen_status包含user_id:2和status:UNSEEN的元素。

您可以使用aggregation framework来获得所需结果。展开数组然后匹配两个条件。这样,您只能获得满足两个条件的数组元素的未展开文档。

在mongo shell中运行(或转换为PHP等效项)。另外,将YourCollection更改为您的实际集合名称:

db.YourCollection.aggregate([ { $unwind: "$user_to_notification_seen_status" }, { $match: { "user_to_notification_seen_status.status": "UNSEEN", "user_to_notification_seen_status.user_id": 2 } } ] );

这将不会返回任何记录,但如果您将id更改为3,则会返回一个。

答案 1 :(得分:0)

Try:
$query = array(
    array('$unwind' => '$user_to_notification_seen_status'),
    array(
        '$match' => array('user_to_notification_seen_status.status' => 'UNSEEN', 'user_to_notification_seen_status.user_id' => 2),
    ),
    );
$cursor = $notification_collection->aggregate($query);