2015-12-26 9 views
0

Я хочу, чтобы запросить все документы, которые имеют идентификаторы из некоторого массива я прошел в мой код от входа пользователя:

var attackersIds = fights[i].attackersIds; 
attackers = cardsCollection.find({"_id" : { "$oid" : { $in: attackersIds } } }); 

Проблемы в том, я получаю сообщение об ошибке для этого:

MongoDB: Can't canonicalize query: BadValue unknown operator: $oid 

I обнаружили, что она может быть решена с помощью ObjectId(...), но когда я делаю так:

var attackersIds = fights[i].attackersIds; 
for(var a=0; a<attackersIds.length; a++){ 
    attackersIds[a] = ObjectId(attackersIds[a]); 
} 
attackers = cardsCollection.find({"_id" : { "$oid" : { $in: attackersIds} } }); 

я получаю другую ошибку:

ReferenceError: \"ObjectId\" is not defined. 

Я предполагаю, что это из-за старой версии node.js, но я не могу ее изменить, поскольку мой серверный провайдер не позволяет мне обновить.

Итак, как я могу запросить mongodb для документов, которые хранятся в моем массиве var attackersIds?

Образцы документов:

{ "_id": { "$oid": "567ee17ae4b0128ba4ce9049" }, "classId": 9, "name": "Recruit", "description": "", "type": "creature", "cost": { "yellow": 1 }, "attack": 1, "defense": 0, "hp": 1, "area": "field1", "playerId": "56590c7ce4b03fe0cf20842d" } 
{ "_id": { "$oid": "567ee17ae4b0128ba4ce904a" }, "classId": 1, "name": "Farm", "description": "", "type": "building", "cost": {}, "attack": 0, "defense": 0, "hp": 5, "generatesMana": { "yellow": 1 }, "area": "hand", "playerId": "56590c7ce4b03fe0cf20842d" } 
{ "_id": { "$oid": "567ee17ae4b0128ba4ce904b" }, "classId": 1, "name": "Farm", "description": "", "type": "building", "cost": {}, "attack": 0, "defense": 0, "hp": 5, "generatesMana": { "yellow": 1 }, "area": "hand", "playerId": "56590c7ce4b03fe0cf20842d" } 
{ "_id": { "$oid": "567ee17ae4b0128ba4ce904c" }, "classId": 9, "name": "Recruit", "description": "", "type": "creature", "cost": { "yellow": 1 }, "attack": 1, "defense": 0, "hp": 1, "area": "deck", "playerId": "56590c7ce4b03fe0cf20842d" } 
+0

Можете ли вы разместить пример документов? Вы используете мангуст? –

+0

@VolodymyrSynytskyi Я добавил образцы документов. О мангусте, у меня никогда не было такого сердца, и я не могу найти примечание об этом в спецификации сервера, поэтому мой ответ «может быть»: P – PolGraphic

+0

вы используете Meteor? – Jay

ответ

2

Try поменять порядок $ в и $ подъязычной

"_id": { 
     "$in": [ 
      { 
       "$oid": "54651022bffebc03098b4567" 
      }, 
      { 
       "$oid": "54651022bffebc03098b4568" 
      } 
     ] 
    } 

в вашем case, вам понадобится небольшая вспомогательная функция, чтобы перейти от массива id к массиву объектов с полем $ oid

attackers = cardsCollection.find({"_id" : { "$in" : attackersIds.map(function(element){ 
    return { 
     "$oid": element 
    }); 
0

Попробуйте преобразовать массив attackersIds в массив типа ObjectID. Как вы можете это сделать, это зависит от пакета, который вы используете для запроса коллекции mongodb.

с mongojs:

var mongojs = require('mongojs'); 
for(var a=0; a<attackersIds.length; a++){ 
    attackersIds[a] = mongojs.ObjectId(attackersIds[a]); 
} 

с MongoDB:

ObjectID = require('mongodb').ObjectID; 
for(var a=0; a<attackersIds.length; a++){ 
    attackersIds[a] = new ObjectId(attackersIds[a]); 
} 

Тогда попробуйте сделать запрос только на _id:

attackers = cardsCollection.find({"_id" : { $in: attackersIds } }); 
+0

Я не могу изменить его и точку, которую я не хочу, поскольку это автоматический идентификатор «type» по умолчанию. Также я видел это во многих других вопросах о SO. В официальной документации упоминается: https://docs.mongodb.org/manual/reference/mongodb-extended-json/ ( '{" $ oid ":" "}' part, где id означает 24-символьный шестнадцатеричная строка).Я работаю с JavaScript, JSON, mongodb. – PolGraphic

+0

Попробуйте создать идентификаторы объектов таким образом: ObjectID = require ('mongodb'). ObjectID .... attackersIds [a] = new ObjectId (attackersIds [a]); –

+0

@PolGraphic Вы используете mongojs? –

0

Вы можете попробовать это, чтобы бросить к ObjectID как это:

mongoose.Types.ObjectId(string) 

Где мангуст ваша мангуст ручка:

var mongoose = require('mongoose') 

Или вы не должны:

CardsCollection.find({_id:{$in:attackersids}})