0

mongo-db で新しいオブジェクトを作成するのに問題があります。meteor-framework を使用していますが、新しいサブアイテムを 1 つのサブアイテム配列に追加したいと考えています。

私のデータ構造は次のようになります。

    { 
       "_id" : "f9d01fd1ef22684353149851", 
       "name" : "Ueberschrift", 
       "items" : [     
                  { "_id" : "be695ec7ffe71152088c57e1",
                    "name" : "asd",
                    "checked" : false,
                    "subitems" : [ ] 
                  },
                  { "_id" : "fe665ec7ffe78852088c22g8",
                    "name" : "asd",
                    "checked" : false,
                    "subitems" : [ ] 
                  } 
                 ] 
     },
     { 
          "_id" : "qw501fd1we522683531qw451",    
          .........
     }, ...

たとえば、サブアイテムを追加したい

 { _id : 1, name : "MySubitemName" }

"be695ec7ffe71152088c57e1"
オブジェクトにある_id : のアイテムへ"f9d01fd1ef22684353149851"

これを行うには、次のコマンドを使用しました。

uid => "f9d01fd1ef22684353149851" and
id => "be695ec7ffe71152088c57e1"

Listitems.update({_id:uid, "items._id" : id}, 
  {"items.$.subitems":  {$push: { _id : 1, name : "MySubitemName" }}});

しかし、うまくいきません。データベースは以前のように見えます。

誰かがアイデアを持っていますか?

4

2 に答える 2

0

ドキュメント構造を定義する際に 1 つのことをお勧めし_idます。この名前は ObjectId を表すために mongodb の内部にあるため、独自のスキーマで使用しないでください。そうすることが厳密な場合は、id代わりに使用してください。http://docs.mongodb.org/manual/reference/object-id/を参照してください。

したがって、ドキュメントは次のようになります。

{ 
    "id" : "f9d01fd1ef22684353149851", 
     "name" : "Ueberschrift", 
     "items" : [     
            { 
                "id" : "be695ec7ffe71152088c57e1",
                "name" : "iop",
                "checked" : false,
                "subitems" : [ ] 
            },
            { 
                "id" : "fe665ec7ffe78852088c22g8",
                "name" : "asd",
                "checked" : false,
                "subitems" : [ ] 
            } 
         ] 
 }

更新クエリ:

Listitems.update({ id:"f9d01fd1ef22684353149851", "items.id" : "be695ec7ffe71152088c57e1"},  {$push: {"items.$.subitems" :{ id : 1, name : "MySubitemName" }}});

mongodb コンソールを使用してテストしましたが、更新クエリで提供されたオブジェクトがコンソールのものと一致すると想定しています。

それがうまくいったかどうか教えてください。

コメントを改善するための編集: クエリを実行するときに実際のオブジェクト ID ( _id) を意味しているため、オブジェクト参照の可能な修正として適用された以下のコードを見てください。

uid => ObjectId("f9d01fd1ef22684353149851") and
id => ObjectId("be695ec7ffe71152088c57e1")

Listitems.update({_id:uid, "items._id" : id}, 
  {$push: {"items.$.subitems" :{ id : 1, name : "MySubitemName" }}});
于 2013-11-14T17:19:30.713 に答える
0

問題は、minmongo がまだ mongo の「$」プレースホルダー演算子をサポートしていないことです。その場合、更新はサーバーから呼び出された場合は正常に実行されますが、クライアントから呼び出された場合は失敗します。現在、その更新プログラムをどこから呼び出していますか?

Meteor チームが提供する回避策の例については、 https ://github.com/meteor/meteor/blob/devel/examples/parties/model.js の「parties」アプリの model.js を参照して ください。

コメントを含めて、キー行 144 ~ 156 を以下に貼り付けました。つまり、サーバーでは "$" を使用し、クライアントでは配列インデックスに置き換えます。

if (Meteor.isServer) {
    // update the appropriate rsvp entry with $
    Parties.update(
      {_id: partyId, "rsvps.user": this.userId},
      {$set: {"rsvps.$.rsvp": rsvp}});
  } else {
    // minimongo doesn't yet support $ in modifier. as a temporary
    // workaround, make a modifier that uses an index. this is
    // safe on the client since there's only one thread.
    var modifier = {$set: {}};
    modifier.$set["rsvps." + rsvpIndex + ".rsvp"] = rsvp;
    Parties.update(partyId, modifier);
  }
于 2013-11-14T23:21:46.537 に答える