2016-10-29 3 views
0

Я не понимаю, почему MongoDB делает это так, может быть, кто-то может объяснить ... ниже мои схемы и код,Сохранение во вложенном массиве MongoDB

-при mongoose-

var postSchema = new mongoose.Schema({ 
    raidName: String, 
    raidDate: String, 
    raidTime: String, 
    raidFaction: String, 
    whosGoing: { type: Array, "default": []} 
}); 


var realmSchema = new mongoose.Schema({ 
    realmName: String, 
    posts: [postSchema] 
}); 

ниже является как моя база данных выглядит

{ 
    "_id": { 
     "$oid": "581447f5fb4fab06dcbf10a6" 
    }, 
    "realmName": "Cho'gall", 
    "posts": [ 
     { 
      "raidName": "wailing cavs", 
      "raidDate": "Sat Oct 29 2016", 
      "raidFaction": "Horde", 
      "raidTime": "1:01 AM", 
      "_id": { 
       "$oid": "58144806fb4fab06dcbf10a7" 
      }, 
      "whosGoing": [ 
       { 
        "role": "DPS", 
        "gender": "Male", 
        "race": "Orc", 
        "classImg": "../images/class_photos/monk.png", 
        "class": "Monk", 
        "level": 90, 
        "name": "Monnky" 
       } 
      ] 
     } 
    ], 
    "__v": 1 
} 

Я могу не создавать новые сообщения, не проблема, однако я не знаю, как добавить больше объектов в массив «whosGoing» .... ниже, что им делать ..

var Realms = mongoose.model('realms'); 

    Realms.findOne({realmName: realm}, function (err, realm) { 
    realm.posts.id(postId).whosGoing.push(thisChar); //pushing it here no problem 
    console.log(realm.posts.id(postId).whosGoing); //when i log it here both objects are in the array just fine 
    console.log(realm); //but when i log the realm here, the item i just pushed is not in there, so of course if I realm.save() it wouldnt take effect... 
    realm.save(); 
    }) 

может кто-нибудь объяснить, почему это происходит, пожалуйста ..

ответ

1

Существует аналогичный вопрос here

Но в принципе вы можете использовать & elementMatch найти желание поста в массиве, и использовать позиционный $ оператор, идентифицировать запись согласованной в запросе. Пример:

var query = { 
    "realmName": realm, 
    "posts": { 
    $elemMatch: { 
     "_id": postId 
    } 
    } 
} 

var setField = { 
    $addToSet: { 
    "posts.$.whosGoing": thisChar 
    } 
} 

Realms.update(query, setField, function(err, results){ 
    if (err){console.log(err)} 
    else { 
    console.log(results); 
    } 
} 
+0

Это работает и имеет смысл, спасибо огромное! – Yandri

0

Использование $push Оператор:

Realms.update({ realmName: realm }, { $push: { whosGoing: thisChar } }, ...) 

Также есть $pull оператор для удаления значения из массива.

Смежные вопросы