是否可以通过一组id在mongodb中插入文档,以便每个新创建的文档的_id是数组中的一个?

时间:2013-09-27 09:22:28

标签: ruby-on-rails mongodb mongoid

在我使用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?

非常感谢任何帮助。

1 个答案:

答案 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是唯一键的问题,因此在示例中,两者都会失败。