如何在mongodb中查询id存储在$in的“var-ids”数组中的文档

How can I query mongodb for documents that ids are stored in my `var ids` array with $in?

本文关键字:文档 var-ids in 数组 存储 mongodb 查询 id      更新时间:2023-09-26

我想查询所有具有ID的文档,这些ID来自我从用户输入传递给代码的某个数组:

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

问题是我得到了一个错误:

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

我发现它可以通过使用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中查询ID存储在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" }

尝试交换$in和$oid 的订单

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

在您的情况下,您将需要一个小的助手函数,用$oid字段从id的数组转到对象的数组

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

尝试将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 } });

您可以尝试将其转换为如下对象:

mongoose.Types.ObjectId(string)

猫鼬在哪里你的猫鼬手柄:

var mongoose = require('mongoose')

或者您可能不需要:

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