2017-09-19 59 views
-2

我有一個包含了一個嵌入文檔的產品,名爲意見的名字此文件:

{ 
    "_id" : 1, 
    "name" : "test", 
    "comments" : [ 
     { 
      "_id" : 2, 
      "userId" : 3, 
      "comment" : "hi", 
      "verified" : false, 
      "date" : ISODate("2017-09-18T21:21:02.280Z") 
     } 
    ] 
} 

我用這個查詢在PHP中獲取評論:

$this->mongo_db->aggregate("Products", [['$unwind' => '$comments'], ['$sort' => ['comments.date' => -1]], ['$project' => ["name" => 1, "comments" => 1]], ['$match' => ['comments.verified' => false]], ['$project' => ["comments._id" => 1, "comments.date" => 1, "comments.dateD" => ['$dateToString' => ['format' => '%Y-%m-%d', 'date' => '$comments.date']]]]]); 

這是我的結果:

{ 
    "_id" : 1, 
    "comments" : { 
     "_id" : 2, 
     "comment" : "hi", 
     "date" : ISODate("2017-09-18T21:21:02.280Z"), 
     "dateD" : "2017-09-18" 
    } 
} 

這是我想在MongoDB中使用聚集結果:

{ 
    "_id" : 1, 
    "name": "test", 
    "comments" : { 
     "_id" : 2, 
     "comment" : "hi", 
     "date" : ISODate("2017-09-18T21:21:02.280Z"), 
     "dateD" : "2017-09-18" 
    } 
} 

現在我想要獲得產品名稱,並且我在$ project中寫入name => 1,但沒有任何返回。當我刪除第二個$項目管道它工作正常。

+0

。如果你只是完全從管道中移除這兩個'$ project'階段,那麼文檔狀態基本上是不變的。所有'$ unwind'都會爲每個數組成員創建一個新的文檔副本。所以它不是'$ unwind'改變文件,它是「你」。 –

+0

@NeilLunn除去兩個$ project後,我該如何使用這個**「comments.dateD」=> ['$ dateToString'=> ['format'=>'%Y-%m-%d','date '=>'$ comments.date']] **? – WithoutBrain1994

+0

'$ project'要求你**明確地指定你想返回的每一個屬性。您只能在新的流水線階段訪問您從前一個流程中發出的數據。因此,只需將'name =>'**添加到相同的舞臺**。並刪除較早的'$ project',因爲它基本上是無用的。 '$ dateToString'在沒有'$ group'的情況下是非常沒用的。如果你打算'$ group',那麼你應該直接在那個階段寫這個。所以看起來你問的是錯誤的問題。 –

回答

1

因爲你`$ project`級中移去它們時,可以簡單地使用$ addFields管道

$this->mongo_db->aggregate("Products", [['$unwind' => '$comments'], ['$sort' => ['comments.date' => -1]], ['$project' => ["name" => 1, "comments" => 1]], ['$match' => ['comments.verified' => false]], ['$addFields' => ["comments.dateD" => ['$dateToString' => ['format' => '%Y-%m-%d', 'date' => '$comments.date']]]]]); 
相關問題