我在MongoDB中遇到问题,主要的想法是我有一个像这样表示的用户集合:
{
"_id" : ObjectId("53e4ac672a486e660a6fe930"),
"username" : "foo",
"firstname" : "bar",
"lastname" : "foobar"
}
我想在一个名为feeds
的集合中插入这样的代码:
{
"username" : "john",
"readed" : 0
}
预期结果应如下所示:
{
"_id" : ObjectId("53e4ac672a486e660a6fe930"),
"username" : "foo",
"firstname" : "bar",
"lastname" : "foobar",
"feeds" : [
{
"username" : "bob",
"readed" : 0
},
{
"username" : "john",
"readed" : 1
},
]
}
目前,我使用更新来执行此操作:
db.account.update({username: 'foo'},
{$addToSet: {feeds: {username: 'john', readed: 0}}})
但我像这样重复:
"feeds" : [
{
"username" : "bob",
"readed" : 0
},
{
"username" : "john", <--- NOT WANTED
"readed" : 0
},
{
"username" : "john",
"readed" : 1
},
]
如果新字段不存在,如何创建新字段?
答案 0 :(得分:1)
你不能这样做。在Mongo的眼中:
{username: "john", readed: 1}
和
{username: "john", readed: 0}
不一样,因此$addToSet
不会合并它们。
答案 1 :(得分:1)
在您的情况下,由于您不希望使用最新值更新readed
字段,您确实可以在单个查询中执行此操作,但$ne
通常使用效率不高
db.account.update({username: "foo","feeds.username":{"$ne":"john"}},
{"$push":{feeds:{username:"john","readed":0}}})
;
如果您想要使用最新值更新字段,这并非易事。 $
不支持upsert
。检查this issue。因此,您需要进行多个查询。