1

在我的带有 mongodb 的 Rails 项目中,我从 twitter 检索用户 ID,我想将其存储在我的 User 模型中。计划是用我在数组中检索到的用户 ID 插入用户集合,并将每个新创建的文档 _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?

非常感谢任何帮助。

4

1 回答 1

0

这是不可能的。从文档中

如果 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});

应该发生什么?没有包含_id1 或 2名称等于“Max”的文档,因此 upsert 必须插入……嗯,什么?也许有两个名为 Max 的文件?如果数组更大,我们会创建大量的“Max”,这可能不是我们的意图(语义是:“更新一个或插入一千个”,这很奇怪)。所以假设我们只插入一个。但是现在,该_id选择哪个?而且,当然,存在_id唯一键的问题,因此在示例中,两者都会失败。

于 2013-09-27T09:52:47.070 回答