MongoDBコレクション内のidを使用して配列エントリを検索する

これは可能ですか?

私は、プロジェクト内の「ユーザーストーリー」の1つを更新したいと思います。プロジェクト内には多くのプロジェクトや多くのユーザーストーリーがあります。私は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データベースの 'stories'内のストーリーを更新したいと考えています。

2

1 答え

原則として、 $ 演算子(位置演算子)を使用して次の操作を行います。

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

しかし、私は _id が予約された名前だと信じています。おそらく、埋め込みオブジェクトに _id を使用しないでください。MongoDB 2.0.1rc-1を使用しているシェルでこれに問題があったので、sthを試してみてください。代わりにこれのように:

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

注意事項があります: $ 演算子は、最初に一致したアイテムでのみ動作し、アップセルでは使用できません。

補足として、あなたが与えた情報から、ユーザーのストーリーを埋め込まないと代わりに別のコレクションを使用する方が良いと感じています。

1つの理由は、組み込みコレクションを使用すると(つまり、何らかの形で配列をマージするか、ロック機構を使用する必要があるときに、同じプロジェクトを多くの人が編集すると)並行性が苦しくなることです。

3
追加された
ありがとう、これは_idで動作するようです。 _idを使うと、mongodbが生成したidの代わりに自分のidを入れることができるからです。さもなければ、私は次のようなものを持っています:_id:ObjectId( "4ecee95d6ce4004424000001")、id:i8Nd3HOhz7hZFzzInfCcapCe。
追加された 著者 Jack,
本格的に試してみませんでしたが、埋め込み_idフィールドは大丈夫だと思います。 Mongoidのようなライブラリはそれらを自動的に作成します。
追加された 著者 Thilo,
彼は、明確にするために_idフィールドを持つべきではない埋め込みドキュメントを参照しています。
追加された 著者 Remon van Vliet,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript