2014-10-21 12 views
10

Aşağıdaki modeli vardır:belirli değer içeren gelmez diziye sahip dokümanları bul

var PersonSchema = new Schema({ 
    name: String, 
    groups: [ 
     {type: Schema.Types.ObjectId, ref: 'Group'} 
    ], 
}); 

Belirli bir Group'un bir parçası olmayan tüm Kişiler alır bir sorgu için arıyorum (yani kişilerin grup dizini belirtilen grubun kimliğini içermez).

böyle bir şey düşünüyordum, ama doğru olduğundan emin değilim: temelde ne çalışıyorsunuz yanlış

Person.find({groups: {$nin: [group._id]})

cevap

18

Hiçbir şey, ama belki de burada sadece açıklama olduğunu Bir diziyi sorgularken $nin veya $in gibi operatörlere gereksinim duyduğunuz yaygın yanlış anlama.

Person.find({ "groups": { "$ne": group._id } }) 

"dizi" operatörleri "dizi hedefler" için değil test etmek koşulların bir "liste" sağlamak için değildir: Ayrıca

Burada asıl yapmak gerekir $ne ile temel bir eşitsizlik maç uygun bir form.

Person.find({ "groups": { "$nin": [oneId, twoId,threeId] } }) 

Dolayısıyla, sadece tek koşullar normal kullanabilirsiniz ve tek bir değer veya bir liste ya karşı birden fazla koşulu test etmek istediğiniz yerler için $in ve $nin kaydedin. Yani bu sadece başka bir yol.

sağlanan listede bulunanların "hiçbiri" o zaman $not operatörü ile mantık ve $all operatörü ters dizinin içeriğini maç nereye bağımsız değişkenler "liste" geçmesi gerekiyor yoksa:

Person.find({ "groups": { "$not": { "$all": [oneId,twoId,threeId] } } }) 

Bu, "sağlanan listenin hiçbiri" dizisinde mevcut olduğu anlamına gelir.

+0

Sadece emin olmak için, gruplar dizisinden en az bir öğenin grup._id'den farklı olduğu tüm Kişileri döndürmeyi önerdiğiniz sorgu değil mi? (Grup dizisindeki tüm elemanların farklı olması gerekir) – Marius

+0

@Marius Sadece bir elemanın içinden geçiyorsunuz, ancak bunu bir dizi içinde '[group._id] 'operatörü uğruna kaydırıyorsunuz. Bir "liste" iletmeyi ve listedeki bu öğelerin hiçbirinin bulunmadığından emin olmak istiyorsanız, bunu temsil etmenin başka bir yolu vardır. –

+0

Tamam, düzenlenmiş cevabınız oldukça açık bir şekilde anlaşıldı. – Marius

İlgili konular