【问题标题】:Searching for an array entry via its id in a MongoDB collection通过 MongoDB 集合中的 id 搜索数组条目
【发布时间】:2012-01-06 00:45:31
【问题描述】:

这可能吗:

我想更新一个项目中的“用户故事”之一,一个项目中可以有很多项目,也可以有很多用户故事。我想通过 id 选择项目,然后根据其 id 选择该项目中的用户故事并更新其字段。

问题:我可以使用什么 MongoDB 查询?

MongoDB 数据库切割

{
  "_id": ObjectId("4ecee95d6ce4004424000001"), //Project ID
  "owner": "test2",
  "stories": [
    {
      "_id": "75vUURHfE1bN9vkbwC2kR85s", //User story Id
      "title": "ok",
      "deadline": "10\/10\/2011",
      "description": "ok",
      "sp": "5",
      "value": "5",
      "roi": "1.00",
      "type": "story",
      "lane": 0
    },
    {
      "_id": "nTsa8x6vFJvdXfFtEHbcFIyl",
      "title": "test",
      "deadline": "10\/10\/2011",
      "description": "test",
      "sp": "5",
      "value": "5",
      "roi": "1.00",
      "type": "story",
      "lane": 0
    },
    {
      "_id": "i8Nd3HOhz7hZFzzInfCcapCe",
      "title": "test #2",
      "deadline": "10\/10\/2011",
      "description": "test #2",
      "sp": "5",
      "value": "5",
      "roi": "1.00",
      "type": "story",
      "lane": 0
    }
  ],
  "team": [

  ],
  "title": "ok"
}

我目前正在使用 socket.io,并在套接字事件中检索以下数据:

JSON

  var story = {
    _id: data.id,
    title: data.title,
    deadline: data.deadline,
    description: data.description,
    sp: data.sp,
    value: data.value,
    roi: data.roi,
    type: data.type
  }

我想使用上述 JSON 对象更新 mongo 数据库中“故事”中的故事。

【问题讨论】:

    标签: json mongodb node.js


    【解决方案1】:

    原则上,您可以使用 $ 运算符 (positional operator) 来做到这一点:

    db.coll.update( {"stories._id":"i8Nd3HOhz7hZFzzInfCcapCe"}, 
                    {$set:{"stories.$.roi":"1.25"}}, false, true )
    

    但是,我认为_id 是保留名称;也许您不应该将_id 用于嵌入式对象——我在使用MongoDB 2.0.1rc-1 的shell 中遇到了这个问题,所以您可能想尝试一下。改为这样:

    db.coll.update( {"stories.id":"i8Nd3HOhz7hZFzzInfCcapCe"}, 
                    {$set:{"stories.$.roi":"1.25"}}, false, true )
    

    有一些警告$ 运算符仅适用于第一个匹配的项目,它不能与 upsert 一起使用。

    附带说明,根据您提供的信息,我觉得最好不要嵌入用户故事,而是使用单独的集合。

    一个原因是,如果您使用嵌入式集合,并发会变得很痛苦(也就是说,如果很多人同时编辑同一个项目,您需要以某种方式合并数组或使用锁定机制)。

    【讨论】:

    • 谢谢,这似乎适用于 _id。我使用 _id 是因为它允许我用自己的 id 代替 mongodb 生成的 id。否则我会有类似的东西:_id:ObjectId(“4ecee95d6ce4004424000001”),id:i8Nd3HOhz7hZFzzInfCcapCe。
    • 他指的是嵌入式文档,为了清楚起见,不应该有 _id 字段。
    • 没有认真尝试过,但我认为嵌入的_id字段还可以。像 Mongoid 这样的库甚至会自动创建这些。
    猜你喜欢
    • 2015-07-24
    • 2022-01-04
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    相关资源
    最近更新 更多