【发布时间】:2013-04-14 19:18:34
【问题描述】:
我在 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 修饰符应用于非数组”
我很确定问题出在我的第二个查询的“更新”组件中,但我不确定如何解决它。任何帮助将不胜感激。
编辑
我的第一个查询现在是...(感谢 Joe)
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?
【问题讨论】:
-
你不能。考虑改变你的架构?
-
我并不是特别想更改我的架构,因为这是完全按照它的输出方式建模的,这意味着一旦我将它从数据库中取出,我就不必进行任何数据整理.我认为这应该是实际上使用 Mongodb 的主要原因?直接将对象建模进出数据库的能力。
标签: mongodb