2016-11-24 4 views
0

Ich habe ein Content Schema. Es hat course und content Feld. content Feld hat 2 Unterfelder content1 und content2, die beide Array ObjectIds sind. Ich möchte alle ObjectIds von content1 abrufen, die später als eine gegebene ObjectId (größer als eine gegebene) erstellt werden.Zurückgeben aller Elemente eines Arrays größer als ein bestimmter Wert in Mungo

Das Problem ist mit meinem Code, ich bin nur eine ObjectId, aber ich möchte alle ObjectIds größer als givenId abrufen.

Mein Schema ist:

var CurrentContentSchema = new mongoose.Schema({ 
    "course" : Number, 
    "content" : { 
     "content1" : [ 
      { 
       type : mongoose.Schema.Types.ObjectId, 
       ref : 'First' 
      } 
     ], 
     "content2" : [ 
      { 
       type : mongoose.Schema.Types.ObjectId, 
       ref : 'Second' 
      } 
     ] 
    } 
}); 

Mein Code ist:

CurrentContent.find({ 
     'course' : givenCourse, 
     'content.content1' : { $gt : givenId} 
    },{ 
     'course' :1, 
     'content.content1.$' : 1 
    }). 
     exec(function(err,contents) {... 
}); 

Jede Hilfe ist sehr geschätzt.

+0

Mit 'ObjectID' für später erstellt repräsentierende nicht eine richtige Sache, da sie immer zu tun arn't auf mehreren Rechnern zu erhöhen. Ziehen Sie in Erwägung, einen Zeitstempel hinzuzufügen, wenn Sie dieses Feld benötigen. – hyades

+0

Ich kann dieses Feature hinzufügen, aber wie bekomme ich alle Elemente des Arrays, die später erstellt werden, dass ein bestimmtes Element durch _id repräsentiert wird? . '$' gibt mir nur ein Array-Element, nicht mehrere. –

+0

Außerdem denke ich, dass 'ObjectId' funktionieren würde, wenn ich nicht an etwas anderes denke (Hinzufügen von' Timestamp'). Aber meine Frage ist, wie man alle Elemente erhält, die zu den Kriterien "$ gt" oder "$ lt" passen, nicht nur eine. –

Antwort

0

find wird nur ein Dokument übereinstimmen, wenn eines der Array-Element in content1 übereinstimmt. Es wird nicht weiter suchen, nachdem es abgestimmt hat. Daher erhalten Sie nur einen Wert in $.

können Sie versuchen, diese Aggregation Pipeline (habe es nicht laufen)

[ 
    { 
     $match: { 
     'course' : givenCourse, 
     'content.content1' : { $gt : givenId} 
     } 
    }, 
    {$unwind: 'content.content1'}, 
    { 
     $match: { 
     'course' : givenCourse, 
     'content.content1' : { $gt : givenId} 
     } 
    }, 
    {$project: { 
     course: 1, 
     content1: '$content.content1' 
    }} 
] 
+0

Kann ich das Popup danach verwenden? –

+0

Ich befürchtete, Aggregation zu verwenden, da ich danach nicht in der Lage sein würde, zu bevölkern. Wenn es einen Weg gibt, sag es mir bitte. –

+0

Verwenden Sie 'DBRef's? Wenn ja, können Sie in welcher Form auch immer projizieren, und in der Callback-Funktion können Sie explizit 'findOne' verwenden, anstatt das mongoose populate zu verwenden. – hyades

Verwandte Themen