Die Abfrage nach dem Auffüllen in Mungo
Bin ich ziemlich neu Mongoose und MongoDB im Allgemeinen, so bin ich eine schwierige Zeit, herauszufinden, wenn etwas wie dies möglich ist:
Item = new Schema({
id: Schema.ObjectId,
dateCreated: { type: Date, default: Date.now },
title: { type: String, default: 'No Title' },
description: { type: String, default: 'No Description' },
tags: [ { type: Schema.ObjectId, ref: 'ItemTag' }]
});
ItemTag = new Schema({
id: Schema.ObjectId,
tagId: { type: Schema.ObjectId, ref: 'Tag' },
tagName: { type: String }
});
var query = Models.Item.find({});
query
.desc('dateCreated')
.populate('tags')
.where('tags.tagName').in(['funny', 'politics'])
.run(function(err, docs){
//docs is always empty
});
Gibt es einen besseren Weg, dies zu tun?
Bearbeiten
Entschuldigung für jede Verwirrung. Was ich versuche zu tun ist, erhalten alle Elemente, die enthalten entweder der lustige tag oder in der Politik-tag.
Bearbeiten
Dokument ohne where-Klausel:
[{
_id: 4fe90264e5caa33f04000012,
dislikes: 0,
likes: 0,
source: '/uploads/loldog.jpg',
comments: [],
tags: [{
itemId: 4fe90264e5caa33f04000012,
tagName: 'movies',
tagId: 4fe64219007e20e644000007,
_id: 4fe90270e5caa33f04000015,
dateCreated: Tue, 26 Jun 2012 00:29:36 GMT,
rating: 0,
dislikes: 0,
likes: 0
},
{
itemId: 4fe90264e5caa33f04000012,
tagName: 'funny',
tagId: 4fe64219007e20e644000002,
_id: 4fe90270e5caa33f04000017,
dateCreated: Tue, 26 Jun 2012 00:29:36 GMT,
rating: 0,
dislikes: 0,
likes: 0
}],
viewCount: 0,
rating: 0,
type: 'image',
description: null,
title: 'dogggg',
dateCreated: Tue, 26 Jun 2012 00:29:24 GMT
}, ... ]
Mit der where-Klausel, bekomme ich ein leeres array.
Du musst angemeldet sein, um einen Kommentar abzugeben.
was Sie fordern ist nicht direkt unterstützt, kann aber erreicht werden durch hinzufügen eines anderen filter-Schritt nach der Abfrage zurückgegeben werden.
zunächst
.populate( 'tags', null, { tagName: { $in: ['funny', 'politics'] } } )
ist definitiv, was Sie tun müssen, um zu filtern-tags-Dokumente. dann, nachdem die Abfrage zurückgibt, müssen Sie ihn manuell herausfiltern Dokumente, die nicht über jedetags
docs, der auf das füllen Kriterien. so etwas wie:Versuchen, anstelle
durch
Update: Bitte werfen Sie einen Blick auf die Kommentare - diese Antwort ist nicht korrekt-match auf die Frage, aber vielleicht ist es auch Antworten zu anderen Fragen, die von Benutzern gestoßen (ich denke, dass wegen den upvotes), so werde ich nicht löschen, diese "Antwort":
Ersten: ich weiß, diese Frage ist wirklich veraltet, aber ich suchte nach genau diesem problem und dieser post SO war der Google Eintrag #1. Also ich habe implementiert die
docs.filter
version (akzeptierte Antwort), aber wie ich gelesen habe in der Mungo v4.6.0 docs können wir jetzt einfach verwenden:Hoffe, das hilft, künftige such-Maschine Nutzer.
fans
) gefiltert wird. Das eigentliche Dokument zurückgegeben (das istStory
enthältfans
als Eigentum) nicht betroffen ist oder gefiltert wird.Nachdem ich das gleiche problem selber vor kurzem habe ich mit der folgenden Lösung:
Zuerst, finden Sie alle ItemTags wo tagName ist entweder 'komisch' oder 'Politik' und liefert ein array von ItemTag _ids.
Dann, finden Gegenstände, die enthalten alle ItemTag _ids in das tags-array
@aaronheckmann 's Antwort für mich gearbeitet, aber ich hatte zu ersetzen
return doc.tags.length;
zureturn doc.tags != null;
weil das Feld enthalten null, wenn es nicht in übereinstimmung mit den Bedingungen, die geschrieben sind im inneren füllen.Also der Letzte code: