我在 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 修饰符应用于非数组”
我很确定问题出在我的第二个查询的“更新”组件中,但我不确定如何解决它。任何帮助,将不胜感激。
编辑
我的第一个查询现在是......(感谢乔)
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 ?