2016-10-26 1 views
0

Also ich habe meine „user“ und „Benutzerprofil: Sammlung und ich brauche einen Weg zu finden, alle Benutzer zu erhalten, die meine Kriterien nicht erfüllenMongo Abfrage mit Datum Zustand und kommt der zweiten Sammlung

Erste Bedingung ist.:

db.userprofile.find ({ "Land": {$ ne: ""}, "Staat": {$ ne: ""}} ) .count()

Aus Mein Benutzerzustand Ich muss jedoch alle Benutzer mit bestimmten Registrierungsdatum wie folgt erhalten:

db.user.find ({created_at: {$ gte: isodate ("2016-04-25T00: 00: 00.000Z"), $ lt: isodate ("2016-10-27T00: 00 : 00.000Z ")}}) .count()

USERPROFILE Sammlung enthält Feld "user_id id "auto erzeugte Feld von Benutzern Sammlung", die wie im Grunde der gleiche Wert ist".

SO Frage ist, wie kann ich alle Benutzer, die Datumskriterien mit allen Benutzern übereinstimmen, die userprofile Kriterien übereinstimmen?

Ich habe versucht, mit der Probe ähnlich wie diese, aber ohne Erfolg:

db.user.aggregate ([{ $ Lookup: { aus: "Userprofile", localField: "_id", foreignField: "Benutzer-ID", als: "user_profile" }}, { $ entspannen: "$ user_profile"}, { $ match: { "user_profile": { "Land": {$ ne:“ "}, " state ": {$ ne:" "}} .}}])() Zählen

Update:

db.user.findOne()

{ 
    "_id" : ObjectId("561fac55c9368676ac000001"), 
    "username" : "somexxx3", 
    "firstname" : "Some", 
    "lastname" : "User", 
    "created_at" : ISODate("2015-10-15T13:38:29.954Z"), 
    "enabled" : false 
} 

db.userprofile.findOne()

db.userprofiles.findOne() 
{ 
    "_id" : ObjectId("56ec222017be1b7c763898a4"), 
    "user_id" : ObjectId("56a77f6c17be1b0a4393d8ea"), 
    "email" : "[email protected]", 
    "country" : "United Sates", 
    "state" : "New York" 
} 

Wenn jemand kann mir dabei helfen, ich würde es sehr schätzen. Alle Hinweise sind willkommen. Danke.

+0

werden Sie Fehler bekommen, während die oben Aggregation zu tun? – Veeram

+0

@Veuram yeap like $ lookup wird nicht erkannt, oder etwas ähnliches – Splendid

+0

@ Splendid welche mongodb-version verwenden Sie? – felix

Antwort

0

sollte diese Abfrage umgehen:

db.user.aggregate([ 
    { 
     $lookup:{ 
     from:"userprofiles", 
     localField:"_id", 
     foreignField:"user_id", 
     as:"user_profile" 
     } 
    }, 
    { 
     $unwind:"$user_profile" 
    }, 
    { 
     $match:{ 
     "user_profile.country":{ 
      $ne:"" 
     }, 
     "user_profile.state":{ 
      $ne:"" 
     }, 
     created_at:{ 
      $gte: ISODate("2016-04-25T00:00:00.000Z"), 
      $lt: ISODate("2016-10-27T00:00:00.000Z") 
     } 
     } 
    }, 
    { 
     $group:{ 
     _id:null, 
     count:{ 
      $sum:1 
     } 
     } 
    } 
]) 

die "$ group" Stufe für Zählergebnisse ist (. Sie db.col.aggregate nicht() verwenden können, zählen()).

sollte die Ausgabe aussehen

{ "_id" : null, "count" : 1 } 

wo „count“ ist die Anzahl der gefundenen Treffer

+0

Tnaks für die Antwort @felix, aber ich bekomme nichts als Ausgabe beim Ausführen dieser Abfrage. – Splendid

+0

@ Splendid vielleicht ein Feld nicht übereinstimmen, könnten Sie bitte die Ausgabe von db.user.findOne() und db.userprofile.findOne()? – felix

+0

Ich habe eine ursprüngliche Frage aktualisiert, wenn In der Übereinstimmung, die ich verwende, nur Übereinstimmung pro Land/Staat funktioniert oder wenn ich nur created_at verwende ... Wenn es keine Ergebnisse kombiniert. – Splendid