2016-08-09 33 views
1

Ich habe diese SammlungMögliche Abfrage mit MongoDB

[{ 
    "_id" : ObjectId("57a8a6c3c48933256cfd8368"), 
    "Title" : "T1", 
    "TitleData" : [ 
     { 
      "UserId" : ObjectId("57a87f5cc48933119cb96f9b"), 
      "Res" : 2 
     }, 
     { 
      "UserId" : ObjectId("57a87f5cc48933119cb96fa7"), 
      "Res" : 2 
     }, 
     { 
      "UserId" : ObjectId("57a87f5cc48933119cb96f96"), 
      "Res" : 2 
     }, 
     { 
      "UserId" : ObjectId("57a87f5cc48933119cb96f9c"), 
      "Res" : 2 
     }, 
     { 
      "UserId" : ObjectId("57a87f5cc48933119cb96f9d"), 
      "Res" : 0 
     } 
    ] 
}, 
{ 
    "_id" : ObjectId("57a8a6c3c48933256cfd8369"), 
    "Word" : "T2", 
    "WordsData" : 
    [ 
     { 
      "UserId" : ObjectId("57a87f5cc48933119cb96f9b"), 
      "Res" : 2 
     }, 
     { 
      "UserId" : ObjectId("57a87f5cc48933119cb96f96"), 
      "Res" : 2   
     } 
    ] 
}, 
{ 
    "_id" : ObjectId("57a8a6c3c48933256cfd8360"), 
    "Word" : "T3", 
    "WordsData" : 
    [ 
     { 
      "UserId" : ObjectId("57a87f5cc48933119cb96f9b"), 
      "Res" : 2 
     }, 
     { 
      "UserId" : ObjectId("57a87f5cc48933119cb96fa7"), 
      "Res" : 0   
     } 
    ] 
} 
] 

Ich brauche eine Abfrage, um nur Dokumente zu extrahieren, die:
a) Enthält in title UserId = "57a87f5cc48933119cb96f9b" AND "57a87f5cc48933119cb96fa7"
b) mindestens eine der 2 title Element muss Keyword-Option haben = 2
Also das Endergebnis sein wird:

[{ 
    "_id" : ObjectId("57a8a6c3c48933256cfd8360"), 
    "Title" : "T3", 
    "TitleData" : 
    [ 
     { 
      "UserId" : ObjectId("57a87f5cc48933119cb96f9b"), 
      "Res" : 2 
     }, 
     { 
      "UserId" : ObjectId("57a87f5cc48933119cb96fa7"), 
      "Res" : 0   
     } 
    ] 
} 
] 

Was ich tun kann, ist Filterergebnisse für das a) Kriterien mit dem folgenden Befehl:

db.getCollection('collection_name').find({TitleData:{$elemMatch:{UserId:ObjectId("57a87f5cc48933119cb96f9b"),UserId:ObjectId("57a87f5cc48933119cb96fa7")}}}) 

, aber ich kann in und mit a) keinen Weg mit dem b) Zustand filtern finden.
Irgendwelche Vorschläge?

[EDIT]
Diese Lösung funktioniert besser für Punkt a).

db.getCollection('collection_name').find({ 
$and: [{ 
    TitleData: { 
    $elemMatch: { 
     UserId: ObjectId("57a87f5cc48933119cb96f9b")   
    } 
    } 
},{ 
    TitleData: { 
    $elemMatch: { 
     UserId: ObjectId("57a87f5cc48933119cb96fa7")   
    } 
    } 
}, 
{ 
    TitleData: { 
    $elemMatch: { 
     $ne: { 
     "Res": 2 
     } 
    } 
    } 
}] 
})); 

Antwort

1

Verwendung $and:

db.getCollection('collection_name').find({ 
$and: [{ 
    TitleData: { 
    $elemMatch: { 
     UserId: ObjectId("57a87f5cc48933119cb96f9b"), 
     UserId: ObjectId("57a87f5cc48933119cb96fa7") 
    } 
    } 
}, { 
    TitleData: { 
    $elemMatch: { 
     $ne: { 
     "Res": 2 
     } 
    } 
    } 
}] 
})); 

Testausgang von der Konsole mit Ihrer Sammlung Objekte:

> db.collection.find({ $and: [{  TitleData: {  $elemMatch: {   UserId: ObjectId("57a87f5cc48933119cb96f9b"),   UserId: ObjectId("57a87f5cc48933119cb96fa7")  }  } },{ TitleData: { $elemMatch: { $ne: { "Res": 2 } } }}]}); 
{ "_id" : ObjectId("57a8a6c3c48933256cfd8368"), "Title" : "T1", "TitleData" : [  { "UserId" : ObjectId("57a87f5cc48933119cb96f9b"), "Res" : 2 }, { "UserId" : ObjectId("57a87f5cc48933119cb96fa7"), "Res" : 2 }, { "UserId" : ObjectId("57a87f5cc48933119cb96f96"), "Res" : 2 }, { "UserId" : ObjectId("57a87f5cc48933119cb96f9c"), "Res" : 2 }, { "UserId" : ObjectId("57a87f5cc48933119cb96f9d"), "Res" : 0 } ] } 

EDIT Haben hinzufügen nicht alle Konsolenausgabe ...

+0

Ja! Die Lösung ist gut! Jetzt versuche ich es in .NET zu implementieren, gab aber immer den Fehler 'Doppelter Elementname' für UserId zurück. Wie auch immer, deine Lösung funktioniert! Vielen Dank ! – Marco

+0

@Marco Warum hast du nicht akzeptiert, funktioniert es nicht wie erwartet? –

+0

Ich überschreibe deine Lösung, um den a) Punkt zu beheben. Deine Lösung für b) Teil ist richtig. – Marco