2012-05-27 10 views
8

Sto provando questo al mongodb console:

db.foobar.update( 
    { name: "Foobar" }, 
    { 
    $set : { foo: { bar: 'bar' }, 
    $inc: { 'foo.count': 1 } 
    } 
}, true) 

Si ritorna con "ok", ma db.foobar.find(), restituisce un set di record vuoto. Sto cercando di upsert un documento, così sembra che il:

name: Foobar 
foo: { 
    bar: 'bar' 
    count: 1 
} 

Se il documento non esiste quindi creare uno con un conteggio di 1. In caso contrario, basta aumentare il numero. Perché non funziona al di sopra?

risposta

7

Mi sembra che il codice stia effettivamente cercando di impostare il campo $ inc del documento anziché utilizzare il modificatore $ inc nel campo foo.count. Questo potrebbe essere quello che vuoi:

db.foobar.update(
    { name: "Foobar" }, 
    { 
     $set: { 'foo.bar': 'bar' }, 
     $inc: { 'foo.count': 1 } 
    }, true) 

Spero che questo aiuti.

+0

Che funziona. Ma perché non funziona: 'db.foobar.update ({nome:" Foobar "}, {$ set: {pippo: {bar: 'bar'}}, $ inc: {'foo.count': 1 }}, vero) 'Sembra che l'impostazione in una stringa lo faccia funzionare. Ma mi chiedo perché non ho notato questo –

+1

! Il messaggio di errore fornito dalla shell è 'avere mod in conflitto in aggiornamento'. Secondo me questo suggerisce che $ set operi sul documento secondario "pippo" nel suo insieme, quindi non puoi usare $ inc su "pippo" o su nessuna delle sue proprietà, come "foo.count". Suppongo che usare $ impostato su "foo.bar" e $ inc su "foo.count" funzioni perché i due modificatori puntano a parti disgiunte del documento. – idrarig

1

Nello snippet di codice fornito, manca una parentesi graffa di chiusura dopo l'oggetto $ set. Ma questo è un problema secondario.

Non credo che sia possibile impostare e incrementare lo stesso documento secondario in un'unica transazione. Poiché count è un membro under foo, su un upsert, non esisterà ancora. L'errore che ottengo quando provo il seguente:

db.foobar.update( 
    { name: "Foobar" }, 
    { 
    $set : { foo: { bar: 'bar' }}, 
    $inc: { 'foo.count': 1 } 
    } 
}, true) 

è "mods in conflitto in aggiornamento". Forse è possibile modellare in questo modo:

db.foobar.update({name:"foobar"},{$set:{foo:{bar:"bar"}},$inc:{count:1}},true); 

o se si preferisce:

db.foobar.update({name:"foobar"},{$set:{foo:{bar:"bar"}},$inc:{"counts.foo":1}},true); 
0

Così Attualmente sto cercando:

var doc = { 
      "name": "thename", 
      "organisation": "theorganisation" 
     }, // document to update. Note: the doc here matches the existing array 
    query = { "email": "[email protected]" }; // query document 
    query["history.name"] = doc.name; // create the update query 
    query["history.organisation"] = doc.organisation; 
    var update = db.getCollection('users').findAndModify({ 
     "query": query, 
     "update": { 
      "$set": { 
       "history.$.name": doc.name, 
       "history.$.organisation": doc.organisation 
      }, 
      "$inc": { "history.$.score": 5 } //increment score 
     } 
    }); 
    if (!update) { 
     db.getCollection('users').update(
      { "email": query.email }, 
      { "$push": { "history": doc } } 
     ); 
    } 
    db.getCollection('users').find({ "email": "[email protected]" }); 

Questo aggiorna il score, e lo aggiunge all'oggetto se non esiste, tuttavia sembra modificare tutti gli oggetti name s in doc.name (cioè "thename" in questo caso).

Non ho ottenuto se il documento non esiste ancora

Problemi correlati