web-dev-qa-db-ja.com

MongoError:ドット付きフィールド..はストレージには無効です

次のクエリを使用して、一致するネストされた属性を持つドキュメントを更新しようとしています

upsertByCommentThreadId: function(commentThread) {
    return CommentThreads.update({
         'youtube.commentThreadId': commentThread.youtube.commentThreadId 
      },
      {
        $set: commentThread
      },
      {
        upsert: true
      }
    );
  }

スキーマ:

Schema({
  youtube: {
    type: Object
  },
  'youtube.etag': {
    type: String
  },
  'youtube.commentThreadId': {
    type: String,
    index: 1
  },
  ...

しかしエラーが出ます

Exception while invoking method ... MongoError: The dotted field 'youtube.commentThreadId' in 'youtube.commentThreadId' is not valid for storage.

ドット表記ではない場合、ネストされた属性を他にどのようにクエリできるかわかりません

24
Tarlen

これはmongo 3.6より前のフィールド名の制限です。mongoサーバーをバージョン3.6以降に更新して、この問題を解決できるようになりました。

https://docs.mongodb.com/manual/reference/limits/#naming-restrictions

10
chroming

キーにドットが存在する場合、MongoDBが機能しないため、エラーが発生します。同様のエラー、

MongoError: The dotted field '2016.11.14' in 'myData.days.2016.11.14' is
            not valid for storage.

コードが次の場合に発生します:

day = "2016.11.14"
myData.days[ day ] = 11

データが変更されたとき

day = "2016_11_14"

問題は修正されました。

7
Gerd

_$set_演算子パラメーターをフラット化する必要があります:

_schema.update( {
  'youtube.commentThreadId': commentThread.youtube.commentThreadId
},
{
  $set: {
    // Here is my change
    'youtube.commentThreadId': commentThread.youtube.commentThreadId
  }
},
{ /* opts */});
_

commentThread(そのupsertByCommentThreadId()関数の入力パラメーター)は表示されていませんが、クエリパーツで判断すると、オブジェクトを送信していると思われます。

_let commentThread = {
  youtube: {
    commentThreadId: 12345
  }
};
_

したがって、クエリ部分は問題ありませんが、_$set_は単純なkey:valueを期待します。ここで、keyは文字列でなければなりません。

したがって、次のようなものを送信しています:

_CommentThreads.update({

     // Here it's ok, as it's translated to:
     // { 'youtube.commentThreadId': 12345 }
     'youtube.commentThreadId': commentThread.youtube.commentThreadId 
  },
  {

    // but this gets expanded to a deeply nested object, like:
    // { $set: { youtube: {commentThreadId: 12345}}} 
    $set: commentThread
  },
  {/* opts */}
);
_

したがって、あなたの_$set_演算子は単純な_{ key: value }_を必要とします。ここで、key文字列です。

3
Zlatko

ネストされた属性をクエリする場合のスキーマは次のとおりです。

Schema({
  youtube: {
    etag:String,
    commentThreadId : {
      type: String,
      index: 1
    }
  },
...

次に、'youtube.commentThreadId':'something'ネストされた属性を照会します。

0
Hasan Ahmed