2014-08-27 86 views
1

1)這裏是我的架構:PowerShell的查詢的MongoDB

{ 
    "_id" : ObjectId("53f4db1d968166157c2d57ce"), 
    "init" : "SJ", 
    "name" : "Steve Jobs", 
    "companies" : [ 
     { 
      "_id" : ObjectId("53f4db1d968166157c2d57cf"), 
      "ticker" : "AAPL", 
      "compname" : "Apple" 
     }, 
     { 
      "_id" : ObjectId("53f4db1d968166157c2d57d0"), 
      "ticker" : "MSFT", 
      "compname" : "Microsoft" 
     }, 
     { 
      "_id" : ObjectId("53f4db1d968166157c2d57d1"), 
      "ticker" : "ABC", 
      "compname" : "iTunes" 
     }, 
     { 
      "_id" : ObjectId("53f4db1d968166157c2d57d2"), 
      "ticker" : "DEF", 
      "compname" : "iPad Mini" 
     } 
    ] 
} 

我試圖讓compnames的列表,使用PowerShell & MongoDB的。這是我到目前爲止:

$databaseName = "CompanyInfo" 
$collectionName = "comps" 
$client = New-Object -TypeName MongoDB.Driver.MongoClient -ArgumentList "mongodb://localhost:27017" 
$server = $client.GetServer() 
$database = $server.GetDatabase($databaseName) 
$collection = $database.GetCollection($collectionName) 

$query['init'] = "SJ" 
$results = $collection.FindOne($query) 
foreach ($result in $results) { 
    write-host $result["companies.ticker"] /// Doesn't show me any records 
} 

這不顯示任何記錄。如何顯示公司.ticker信息,其中init =「SJ」?

2)順便說一句,我得到

$query['init'] = "SJ" 

錯誤

Cannot index into a null array. 
At line:9 char:1 
+ $query['init'] = "SJ" 
+ ~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [], RuntimeException 
    + FullyQualifiedErrorId : NullArray 

任何想法,爲什麼後出現以下錯誤?我只有MongoDB的標準索引,它是「_id」,沒有別的。我的powershell腳本仍然有效,但我很好奇,爲什麼我得到這個錯誤。

[更新第2]感謝@ arco444,我不再收到錯誤部分2.這是我修改後的代碼:

$query = @{'init' = "SJ"} 
$collection.FindOne([MongoDB.Driver.QueryDocument]$query) 

但我確實需要與第1部分幫助 - 這是顯示只有公司代表特定的init。對此有任何想法?

[回答第1部分]再次感謝@ arco444指導我走向正確的道路。經過一番修改之後,我發現我錯過了什麼。這裏是我更新的代碼:

$databaseName = "CompanyInfo" 
$collectionName = "comps" 
$client = New-Object -TypeName MongoDB.Driver.MongoClient -ArgumentList "mongodb://localhost:27017" 
$server = $client.GetServer() 
$database = $server.GetDatabase($databaseName) 
$collection = $database.GetCollection($collectionName) 

$query = new-object MongoDB.Driver.QueryDocument("init","SJ") /// Updated 
$results = $collection.FindOne($query) 
foreach ($result in $results["companies"]) { /// Updated 
    write-host $result["ticker"] /// Updated 
} 

回答

0

這裏是我更新的代碼:

$databaseName = "CompanyInfo" 
$collectionName = "comps" 
$client = New-Object -TypeName MongoDB.Driver.MongoClient -ArgumentList "mongodb://localhost:27017" 
$server = $client.GetServer() 
$database = $server.GetDatabase($databaseName) 
$collection = $database.GetCollection($collectionName) 

$query = new-object MongoDB.Driver.QueryDocument("init","SJ") /// Updated 
$results = $collection.FindOne($query) 
foreach ($result in $results["companies"]) { /// Updated 
    write-host $result["ticker"] /// Updated 
} 
1

從閱讀MongoDB的documentation,它看起來像你需要正確初始化先查詢對象。試試這個:

$query = new-object MongoDB.Driver.QueryDocument("init","SJ") 
$results = $collection.FindOne($query) 
+0

謝謝。這消除了這個錯誤。但是,您能否介紹一下如何使用PowerShell顯示公司代碼? – 2014-08-27 15:58:48

+0

@inquisitive_one更新了答案,再去一次。 – arco444 2014-08-27 16:29:24

0

所以,當我用你的查詢過程與

$mongoDbDriverPath = 'D:\mongo\driver\' 
$mongoServer = 'myserver:27000' 

Add-Type -Path "$($mongoDbDriverPath)MongoDB.Bson.dll" 
Add-Type -Path "$($mongoDbDriverPath)MongoDB.Driver.dll" 

$databaseName = 'Tickets' 
$collectionName = 'MongoUserTicket' 

$client = New-Object -TypeName MongoDB.Driver.MongoClient -ArgumentList "mongodb://$mongoServer" 
$server = $client.GetServer() 
$database = $server.GetDatabase($databaseName) 
$collection = $database.GetCollection($collectionName) 

$query = new-object Mongodb.driver.querydocument('Id','5') 
$query2 = New-object Mongodb.driver.querydocument('Type','User') 
$results = @() 
foreach($item in $collection.Find($query)) 
{ 
    $results += $item 
} 

我得到的查詢意想不到的結果: 當管道獲取成員爲結果我得到這個:

TypeName: MongoDB.Bson.BsonElement 

Name  MemberType Definition                                  
----  ---------- ----------                                  
Clone  Method  MongoDB.Bson.BsonElement Clone()                            
CompareTo Method  int CompareTo(MongoDB.Bson.BsonElement other), int IComparable[BsonElement].CompareTo(MongoDB.Bson.BsonElement other)       
DeepClone Method  MongoDB.Bson.BsonElement DeepClone()                           
Equals  Method  bool Equals(MongoDB.Bson.BsonElement rhs), bool Equals(System.Object obj), bool IEquatable[BsonElement].Equals(MongoDB.Bson.BsonElement other) 
GetHashCode Method  int GetHashCode()                                
GetType  Method  type GetType()                                 
ToString Method  string ToString()                                
Name  Property string Name {get;}                                
Value  Property MongoDB.Bson.BsonValue Value {get;set;}  

當在shell提示符我得到的數據輸入$結果我想到:

$results 

Name     Value                                                
----     -----                                                
Id     5 
AccessToken    
CreatedOn    2013-09-27T22:05:52.246Z                                            
TokenExpiration 2013-09-27T22:20:52.246Z                                            
RefreshTokenExpiration 2013-09-28T22:05:52.246Z                                            
ProfileToken   BsonNull                                                
Type    User                                                
Id     5 
AccessToken    
CreatedOn    2013-09-27T23:42:28.492Z                                            
TokenExpiration 2013-09-27T23:57:28.492Z                                            
RefreshTokenExpiration 2013-09-28T22:06:04.071Z                                            
ProfileToken   BsonNull                                                
Type    User 
0

這裏是讓我得到一個對象,我可以操作上:

$results = @() 
foreach($item in $collection.Find($query)) 
{ 
    $props = @{} 
    $item | foreach { $props[ $_.name ] = $_.value } 
    $pso = [pscustomobject]$props 
    $results += $pso 
} 

全碼:

$mongoDbDriverPath = 'D:\mongo\driver\' 
$mongoServer = 'myserver:27000' 

Add-Type -Path "$($mongoDbDriverPath)MongoDB.Bson.dll" 
Add-Type -Path "$($mongoDbDriverPath)MongoDB.Driver.dll" 

$databaseName = 'Tickets' 
$collectionName = 'MongoUserTicket' 

$client = New-Object -TypeName MongoDB.Driver.MongoClient -ArgumentList "mongodb://$mongoServer" 
$server = $client.GetServer() 
$database = $server.GetDatabase($databaseName) 
$collection = $database.GetCollection($collectionName) 

$query = new-object Mongodb.driver.querydocument('Id','5') 
$query2 = New-object Mongodb.driver.querydocument('Type','User') 
$results = @() 
foreach($item in $collection.Find($query)) 
{ 
    $props = @{} 
    $item | foreach { $props[ $_.name ] = $_.value } 
    $pso = [pscustomobject]$props 
    $results += $pso 
} 
$results