16

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 する方法はありますか?

4

2 に答える 2

18

私はついにそれを手に入れました...誰かがこれを行うためのより良い方法を見ることができれば、答えとして追加してください。

// create the userlinks collection if it doesn't exist
// also add a tag 'foo' into it, but only if the tag doesn't exist
db.userlinks.update (
    {_id: '1', 'tags.tag': {$nin: ['foo']}}, 
    {$push: {'tags': {tag:'foo', links:[]}}},
    {upsert: true}
)

// add a link into the 'foo' tag, but only if the link doesn't exist
db.userlinks.update(
    {_id: '1', 'tags.tag': 'foo', 'tags.links.link': {$nin: ['http://foobar.com']}},
    {$push: {'tags.$.links': {link: 'http://foobar.com', date: '15'} } }
)
于 2013-04-15T18:52:34.720 に答える
1

おそらく、最初のクエリを次のように変更します。

db.userlinks.update (
    {_id: 1, tags: {$nin: [{tag:'foo'}]}}, 
    {$push: {'tags': {tag:'foo', links:[]}}}, 
    {upsert: true}
)

$push 操作は、タグではなく、リンクにのみ影響する必要があります。

{$push: {'tags.links': {link: 'http://www.google.com', date: '123'} } },
于 2013-04-14T19:28:10.870 に答える