次のクエリを使用して、一致するネストされた属性を持つドキュメントを更新しようとしています
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.
ドット表記ではない場合、ネストされた属性を他にどのようにクエリできるかわかりません
これはmongo 3.6より前のフィールド名の制限です。mongoサーバーをバージョン3.6以降に更新して、この問題を解決できるようになりました。
https://docs.mongodb.com/manual/reference/limits/#naming-restrictions
キーにドットが存在する場合、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"
問題は修正されました。
_$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
文字列です。
ネストされた属性をクエリする場合のスキーマは次のとおりです。
Schema({
youtube: {
etag:String,
commentThreadId : {
type: String,
index: 1
}
},
...
次に、'youtube.commentThreadId':'something'
ネストされた属性を照会します。