我在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修饰符应用于非数组"
我很确定问题出在我第二个查询的"更新"部分,但我不确定如何解决它.任何帮助都将不胜感激.
EDIT
我的第一个问题是...(感谢乔)
db.userlinks.update (
{_id: 1, tags: {$nin: [{tag:'foo'}]}},
{$push: {'tags': {tag:'foo', links:[]}}},
{upsert: true}
)
我的第二个问题是...
db.userlinks.update (
{_id: 1, 'tags.tag': 'foo'},
{$push: {'tags.$.links': {link: 'http://www.google.com', date: '123'} } }
)
它成功地将链接推送到"链接"数组中,但也允许重复.我不允许重复链接$addToSet是一种工作方式,但是如果日期发生变化,它仍然会插入一个重复的链接.
有没有办法在我的第二个查询的"查询"部分判断链接的存在,或者在某些字段匹配的情况下只判断addToSet?