2015-07-27 2 views
2

по теме: mongodb/meteor collection check if subdocument field exists when field is a variableMongoDB/метеор коллекция запросов с JavaScript Object

Я пытаюсь запросить коллекцию Метеор путем создания объекта с некоторыми именами переменных полей. Это работает, когда объект имеет одно поле, например

var query = {}; 
query['myField.'+myVariable] = {$exists: true}; 
Collection.find(query); //works fine 

Но мне нужно запросить несколько селекторов. Например, мне нужно проверить, существует ли имя поля с переменной, а также проверить, есть ли другое поле = true, а также какое-то другое поле = переменная. Поэтому я пытаюсь найти общий способ создания объектов запроса. Я пробовал следующее:

var query = {}; 
query['myField.'+myVariable] = {$exists: true}; 
query[newField] = false; 
Collection.find(query); 

Это не работает. Я не уверен, что это потому, что «newField» не имеет типа Object или что-то еще.

Я пробовал также с помощью $ и селектор, чтобы увидеть, если это работает, но я не думаю, что синтаксис я использую точно правильно ...

var query = {}; 
var object = {}; 
object['myField'.+myVariable] = {$exists: true}; 
query['$and'] = [object, {newField: false}]; 
Collection.find(query); 

Это также не работает , Я пытался построить с помощью mongo $ и селектора, который работает с использованием массива.

Как я могу синтаксически строить запрос коллекции Метеор с нотацией объектов JavaScript и объектными литералами? Я чувствую, что любой из них должен работать.

Чтобы быть конкретными, я ищу следующий (пол псевдокод после получения поддокумента/субобъекта с точечной нотацией не работает с запросом Монго)

Collection.find({correlated: false, readBy.(Meteor.userId()): {$exists: true} ...) 

Я также думал, что это должно работать:

var query = {}; 
query['myField.'+myVariable] = {$exists: true}; 
Collection.find(query, {otherField: false}) 
//OR 
var query2 = {}; 
query['priority'] = false; 
Collection.find(query, query2) 

Но ни один из них не делает.

EDIT: пример документа. Я хочу, чтобы найти документ таким образом, что текущий идентификатор пользователя НЕ readBy области и коррелируют: ложные

{ 
    "_id" : ObjectId("55b6868906ce5d7b1ac6af10"), 
    "title" : "test", 
    "correlated" : "false", 
    "readBy" : { 
     "DXqLhesDEJq4ye8Dy" : ISODate("2015-07-27T18:29:43.592Z") 
    } 
} 
+0

Псевдокод - самая важная строка всего этого вопроса. Можете ли вы убедиться, что он охватывает все, что вы хотите, из запроса? То есть не оставляйте ничего. –

+0

Важно знать, что запросы манго - это только объекты JavaScript, поэтому нотация не имеет значения. Объект запроса во втором блоке кода выглядит корректно для меня, я просто предполагаю, что ваш запрос не находит ничего, а не работает. – azium

+0

И что вы подразумеваете под * Это не работает? * Какова структура ваших документов? – styvane

ответ

1

Существует только один селектор аргумент в find. Таким образом:

Collection.find(query, {otherField: false}) 

Неправильная версия. query должен содержать информацию о otherField. Посмотрите на этот пример код:

// 'readBy.abc123' 
var key = 'readBy.' + Meteor.userId(); 

// build the selector by parts 
var selector = {correlated: false}; 
selector[key] = {$exists: false}; 

// selector should now be something like: 
// {correlated: false, 'readBy.abc123': {$exists: false}} 
// note that these are ANDed together so all conditions must be true 

// here's a cursor you can use to fetch your documents 
var cursor = Collection.find(selector); 

// log one of the selected documents 
console.log(Collection.findOne(selector)); 
+0

Я понимаю, почему последние два неверны, и синтаксис имеет смысл, спасибо. Вероятно, есть причина базы данных, почему они не получают, но запрос настолько прост. Я не уверен, почему я не получаю результатов. – frei

+0

Я думаю, что возможно, что мне нужно обернуть 'коррелированный' и' false' в строку, такую ​​как 'var selector = {'correlated': 'false'} Потому что, когда я пытаюсь использовать findOne с консоли, я не получаю ничего, если я не сделаю этого. – frei

+0

В вашем вопросе я бы рекомендовал отобразить пример документа, который вы пытаетесь выбрать. –

Смежные вопросы