在我使用mongodb的Rails项目中,我从twitter检索用户ID,我想将其存储在我的用户模型中。计划是使用我在数组中检索的用户ID来复制Users集合,并将每个新创建的文档_id设置为数组中相应的用户ID。
所以当我做这样的事情时:
Tweep.collection.find( _id: 1234567 ).modify( { "$set" => {a: true}, "$unset" => {c: ""} }, {upsert: true})enter code here
结果如预期:<Tweep _id: 1234567, a(active): true, c(candidate_value): nil>
现在我想做同样的事情,但只传递一组id来在我的用户上复制我的集合:
Tweep.collection.find(_id: {"$in" =>[123124,223553,6343643,23423]}, c: { "$exists" => true }).modify( { "$set" => {p: true}, "$inc" => {c: 1} }, {upsert: true})
结果是一些新创建的文档,但没有所需的值作为_id,例如_id:123124:
<Tweep _id: 5244501325fed0cfd2c1a615, a(active): nil, c(candidate_value): 1>
而不是:
<Tweep _id: 123124, a(active): nil, c(candidate_value): 1>
如何让mongodb使用我的数组中的用户ID作为字段_id的id?
非常感谢任何帮助。
答案 0 :(得分:0)
这是不可能的。来自the documentation:
如果upsert设置为true且没有文档与查询匹配 条件,update()插入单个文档。
然后,你写道:
结果是一些新创建的文件
我希望它真的只有一个文档。对于仅包含_id : {$in : [...]}
的查询,它甚至不会在我的计算机上插入单个文档(MongoDB 2.5.0)。它只会在我添加更多条件时插入。你能再次检查一下吗?
很难想出一个有关如何表现的有意义的定义。合并$in
可能很棘手。我们假设您有两份文件:
{ _id : 1, name : "John" }
{ _id : 2, name : "Jane" }
你打电话
db.update({"_id" : {$in : [1,2]}, "name" : "Max"}, { ... }, { upsert: true});
应该发生什么?没有_id
1或2 和名称等于&#34; Max&#34;的文档,所以upsert必须插入......好吧,什么?也许有两个名为Max的文件?如果阵列较大,我们会创建一个 ton 的“Max”,这可能不是我们的意图(语义将是:&#34;更新一个或插入一千个&#34;,这是奇数)。所以,我们只说插入一个。但现在,_id
选择哪个?当然,存在_id
是唯一键的问题,因此在示例中,两者都会失败。