【问题标题】:Document exact matching文档精确匹配
【发布时间】:2013-11-03 01:29:54
【问题描述】:

假设我们有以下 MongoDB 集合:

{id:1, data:"some_data"}
{id:2, data:"some_data"}
{id:3, data:"some_data"}
{id:4, data:"some_data"}

我还有一个 php 数组,其中元素“6”不在集合中

 $q = [1,3,6];

如果我这样查询集合:

 $cursor = $db->col->find(['id' => ['$in' => $q]]);

我正在获取 id 为 1 和 3 的文档

但我想要一个空结果,因为集合中不存在 id 6, 我怎样才能完全匹配集合?

我可以只用一个查询来做到这一点吗?

【问题讨论】:

  • 如果q = [1,3],你想得到什么?
  • 当然只有 id 为 1 和 3 的文档,但只是因为它们当前在集合中。
  • 那么如果q = [1,3,6],您希望find 给您返回0、1、2 或3 个文档吗?
  • 正如我已经说过的,我想得到一个空结果,因为 id:6 不在集合中
  • 好的,但这就像我从未见过的 SQL 查询或 Mongo 查询一样。

标签: php mongodb mongodb-query


【解决方案1】:

如果id 是唯一的:

var result = db.col.find({id:{$in:q}});
if(result.count() == q.length) {
    //handle result
} else {
    //handle empty result
}

【讨论】:

  • 但是如果想用 PHP 来做呢?假设我有一个 php 数组: $q = [1,2,3,6]; $cursor = $db->col->find(["id" => ['$in' => $q]]);这个查询会拉下所有数据吗?
  • 我建议在你的问题中提出这个问题,并添加适当的标签。我个人避开 PHP。
【解决方案2】:

你不能只用一个 mongodb 查询来做到这一点,因为它没有这样的功能。

我也不明白你到底为什么需要这个,你可以这样做:

$q = [1,3,6];
$res = array();
$cursor = $db->col->find(['id' => ['$in' => $q]]);
foreach($cursor as $val){
  $res[$val['id']] = $val['data'];
}

foreach($q as $val){
 if (!isset($res[$val])) $res[$val] = ''; // to show that there is nothing in the results.
}

附:这段代码我没试过,可能有错误。

【讨论】:

    猜你喜欢
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    相关资源
    最近更新 更多