2014-08-27 2 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 все еще работает, но мне любопытно, почему я получаю эту ошибку.

[UPDATE Часть 2] Благодаря @ arco444, я больше не получаю ошибку в части 2. Вот мой пересмотренный код:

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

Но я на самом деле нужна помощь с частью 1 - что для отображения только тикеры компании для конкретного init. Есть идеи по этому поводу?

[ANSWER Part 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? –

+0

@inquisitive_one Обновили ответ, попробуйте еще раз. – arco444

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;}  

При вводе $ результатов на командной строке я получаю данные я ожидаю:

$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 
Смежные вопросы