2014-08-27 3 views
1

interrogation 1) Voici mon schéma: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" 
     } 
    ] 
} 

J'essaie d'obtenir une liste des compnames, en utilisant Powershell & MongoDB. Voici ce que j'ai jusqu'à présent:

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

Ceci ne me montre aucun enregistrement. Comment afficher company.ticker info où init = "SJ"?

2) BTW, je reçois l'erreur suivante après

$query['init'] = "SJ" 

erreur

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

Toutes les idées pourquoi? Je n'ai que l'index standard de MongoDB, qui est sur "_id", rien d'autre. Mon script PowerShell fonctionne toujours mais je suis curieux de savoir pourquoi j'ai cette erreur.

[UPDATE Partie 2] Merci à @ arco444, je ne reçois erreur dans la partie 2. Voici mon code révisé:

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

Mais je dois effectivement aider à la partie 1 - qui consiste à afficher seulement les tickers de l'entreprise pour un init particulier. Des idées sur celui-là?

[RÉPONSE Partie 1] Merci encore à @ arco444 de m'avoir indiqué le bon chemin. Après quelques bricolages, j'ai compris ce qui me manquait. Voici mon code mis à jour:

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

Répondre

0

Voici mon code mis à jour:

$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

À la lecture du MongoDB documentation, il semble que vous devez initialiser l'objet de requête correctement d'abord. Essayez ceci:

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

Merci. Cela a éliminé cette erreur. Mais pourriez-vous faire la lumière sur la façon d'afficher les tickers de l'entreprise en utilisant PowerShell? –

+0

@inquisitive_one Avez-vous mis à jour votre réponse? – arco444

0

Alors, quand j'utilise votre procédure de requête avec

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

Je reçois des résultats inattendus pour la requête: Lorsque la tuyauterie pour obtenir membre pour les résultats, je reçois ceci:

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

Lorsque vous entrez $ résultats à l'invite du shell, je reçois les données que je pense:

$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

voici ce qui m'a permis d'obtenir un objet que je puisse fonctionner sur:

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

code complet:

$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