Mongodb に次のようなドキュメント スキーマがあります。
{
_id: 1
tags: [{
tag: 'foo'
links: [{
link: 'http:www.google.com'
date: '123'
}]
}]
}
ドキュメントに固有の「リンク」配列にリンクをプッシュしようとしています。
私の最初のクエリ...
db.userlinks.update (
{_id: 1, tags: {$nin: [{tag:'foo'}]}},
{$push: {'tags': {tag:'foo'}}},
{upsert: true}
)
これをくれます (存在しない場合はタグを作成します)
{ "_id" : 1, "tags" : [ { "tag" : "foo" } ] }
次に、このクエリでフォローアップします...
db.userlinks.update (
{_id: 1, tags: {tag: 'foo', links: {$nin: [{link: 'http://www.google.com'}]}}},
{$push: {tags: {tag: 'foo', links: {link: 'http://www.google.com', date: '123'}}}},
{upsert: true}
)
しかし、次のエラーが表示されます:「$push/$pushAll 修飾子を非配列に適用できません」
問題は 2 番目のクエリの「更新」コンポーネントにあると確信していますが、修正方法がわかりません。どんな助けでも大歓迎です。
編集
私の最初のクエリは... (Joe に感謝)
db.userlinks.update (
{_id: 1, tags: {$nin: [{tag:'foo'}]}},
{$push: {'tags': {tag:'foo', links:[]}}},
{upsert: true}
)
私の2番目のクエリは今...
db.userlinks.update (
{_id: 1, 'tags.tag': 'foo'},
{$push: {'tags.$.links': {link: 'http://www.google.com', date: '123'} } }
)
これにより、リンクが「links」配列に正常にプッシュされますが、重複も許可されます。リンクの重複は許しません。$addToSet の種類は機能しますが、日付が変更された場合でも、重複したリンクが挿入されます。
2 番目のクエリの「クエリ」部分でリンクの存在を確認する方法、または特定のフィールドが一致する場合にのみ addToSet する方法はありますか?