1

次のような他のコマンドは正しく機能します。

let commandDictionary = ["count": "trials"]
let error: NSError?
let result = myConnection.runCommandWithDictionary(
    commandDictionary, 
    onDatabaseName: databaseName, 
    error: &error
)

ただし、コマンドを実行しようとしても、次のdistinctようにはなりません。

let commandDictionary = ["distinct": "trials", "key": "location"]
let error: NSError?
let result = myConnection.runCommandWithDictionary(
    commandDictionary, 
    onDatabaseName: databaseName, 
    error: &error
)

これを実行した後の値errorは:Optional("MONGO_COMMAND_FAILED: The command returned with \'ok\' value of 0")です。シェルで同じコマンドを実行すると(私は信じています)、正気の値が得られます。

db.runCommand({distinct: "trials", key: "location"})

更新 #1:

また、MongoConnection.serverVersion()私に: を与え"2.6.3"、 をMongoConnection.serverError()返しますnil。シェルでコマンドを実行すると、詳細なサーバー ログに次のように表示されます。

2014-12-12T10:11:54.556-0500 [conn69] command eim.$cmd command: distinct { distinct: "trials", key: "metadata.location" } keyUpdates:0 numYields:0 locks(micros) r:606 reslen:210 0ms

そして、ObjCMongoDb によって実行されるコマンドについて、次のように表示されます。

2014-12-12T10:10:25.945-0500 [conn171] command eim.$cmd command: isMaster { key: "metadata.location", distinct: "trials" } ntoreturn:1 keyUpdates:0 numYields:0 reslen:138 0ms

更新 #2:

どこかでdistinctコマンドがコマンドにマップされているisMasterようです。これは他のコマンドでも発生します。たとえば、コマンド{listDatabases:1}は にもマップさisMasterれます。ただし、コマンド{buildInfo:1}は に正しくマップされていbuildInfoます。

4

1 に答える 1

0

このイシュー レポートで説明されているように、問題はデータベースがキーを順番に並べる必要があることですが、Objective-C と同様に Swift は辞書キーの順序を保持しません。

ライブラリの作成者として、私が提案する回避策は、ライブラリに含まれている OrderedDictionary を使用してコマンドを作成することです。

アップデート:

ライブラリのバージョン 0.12.0 では、-runCommandWithDictionary は廃止されました。新しいメソッドのコードは次のとおりです。

let error: NSError?
let result = myConnection.runCommandWithName(
    "distinct", 
    value: "trials",
    arguments: ["key": "location"],
    onDatabaseName: databaseName, 
    error: &error
)
于 2014-12-26T23:50:34.387 に答える