0

如果数据不存在或存在且早于...,我尝试使用条件过滤一些结果

我有使用 PHP 查询构建器的查询构建

 ->addOr(
            ['interactions.lastDisplays' => ['$elemMatch' => [
                'user' => new \MongoId($id),
                'date' => ['$lte' => $date]
            ]]],
            ['interactions.lastDisplays.user' => ['$ne' => new \MongoId($id)]]
        )

它记录到:

db.Post.find({ 
"$or": [ 
{ "interactions.lastDisplays": { 
    "$elemMatch": { "user": ObjectId("5a61bb816e0bb1542a0bc574"),
    "date": { "$lte": new ISODate("2019-06-14T13:22:01+00:00") } } } },
{ "interactions.lastDisplays.user": { 
    "$ne": ObjectId("5a61bb816e0bb1542a0bc574") } 
}] 
}).limit(25).skip(0);

由于某种原因,它不会在 PHP 中返回任何结果。当我复制它并直接在数据库上运行时,它工作正常,并返回所有 25 个结果。

4

1 回答 1

0

解决方案就像更改$lte为 MongoDate 一样简单。

 ->addOr(
        ['interactions.lastDisplays' => ['$elemMatch' => [
            'user' => new \MongoId($id),
            'date' => ['$lte' => $new \MongoDate($date->getTimestamp())]
        ]]],
        ['interactions.lastDisplays.user' => ['$ne' => new \MongoId($id)]]
    )

我还不明白的奇怪之处在于它曾经DateTime在其他查询中使用(但它们没有嵌套的数组条件,所以可能是问题所在)。而且那个查询日志也差不多。

于 2018-06-15T09:47:30.173 回答