2014-08-27 84 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