【问题标题】:Powershell querying MongoDBPowershell 查询 MongoDB
【发布时间】:2014-08-27 14:42:13
【问题描述】:

1) 这是我的架构:

{
    "_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"
        }
    ]
}

我正在尝试使用 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
}

这没有显示任何记录。如何在 init = "SJ" 的地方显示 company.ticker 信息?

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 的公司代码。有什么想法吗?

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

【问题讨论】:

    标签: mongodb powershell mongodb-.net-driver mongodb-query


    【解决方案1】:

    通过阅读 MongoDB documentation,看来您需要先正确初始化查询对象。试试这个:

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

    【讨论】:

    • 谢谢。这消除了那个错误。但是您能否阐明如何使用 powershell 显示公司代码?
    【解决方案2】:

    这是我更新的代码:

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

    【讨论】:

      【解决方案3】:

      所以当我使用你的查询过程时

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

      我得到了意想不到的查询结果: 当管道到 Get 成员以获得结果时,我得到这个:

         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 时,我得到了我期望的数据:

      $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 
      

      【讨论】:

        【解决方案4】:

        这是让我获得可以操作的对象的原因:

            $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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-02-18
          • 2019-06-18
          • 2015-06-24
          • 2014-02-22
          • 2012-01-20
          • 2017-07-19
          相关资源
          最近更新 更多