0

私はこのデータを持っています:

_id : 1
status:1, 
name:"name",
details:
{ 
  crm:115, 
  webs: 
    { tag:"blog" , url:"http://..."}, 
  contacts:
    {
      _id:1,
      name:"me", 
      phones:
        { tag:"home", number:"123..." },
        {tag:"mobile", number:"123456789"}
    }
}

「電話」にもう1つエントリが欲しい{tag:office", number:"9823..."}

そのためのコマンド/クエリは何でしょうか?

4

2 に答える 2

2

次のクエリを使用して、これを配列に簡単にプッシュできます (貼り付けた JSON は少し有効ではなかったため、変更する必要がありました)。

db.collection.drop();
db.collection.insert( {
    _id : 1,
    status: 1, 
    name: "name",
    details: { 
        crm:115, 
          webs: {
            tag:"blog",
            url:"http://..."
        }, 
        contacts: {
            _id: 1,
            name: "me", 
            phones: [
                { tag: "home", number: "123..." },
                { tag:"mobile", number:"123456789" }
            ]
        }
    }
} );

db.collection.update(
    { _id: 1 },
    { $push : { 'details.contacts.phones' : {  tag:"office", rname:"9823" } } }
);

db.collection.find().pretty();
{
    "_id" : 1,
    "details" : {
    "contacts" : {
        "_id" : 1,
        "name" : "me",
        "phones" : [
            {
                "tag" : "home",
                "number" : "123..."
            },
            {
                "tag" : "mobile",
                "number" : "123456789"
            },
            {
                "tag" : "office",
                "rname" : "9823"
            }
        ]
        },
        "crm" : 115,
        "webs" : {
        "tag" : "blog",
        "url" : "http://..."
        }
    },
    "name" : "name",
    "status" : 1
}
于 2013-07-11T13:10:41.287 に答える
0

演算子の値は、$push更新する配列を参照する必要があります。したがって、配列フィールドが他のドキュメントに埋め込まれている場合は、次のようにドット表記を使用する必要があります。

db.abcd.update({_id: 1}, 
    {$push: {"details.contacts.phones": {tag:"office", rname:"9823"}}});
于 2013-07-11T13:08:42.790 に答える