【问题标题】:How can I query mongodb for documents that ids are stored in my `var ids` array with $in?如何在 mongodb 中使用 $in 查询 id 存储在我的 `var ids` 数组中的文档?
【发布时间】:2015-12-26 20:16:47
【问题描述】:

我想从用户输入的某个数组中查询所有具有 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" }

【问题讨论】:

  • 你能发一个文件的例子吗?你用猫鼬吗?
  • @VolodymyrSynytskyi 我添加了示例文档。关于猫鼬,我从来不关心它,我在服务器规范中找不到关于它的注释,所以我的回答是“也许”:P
  • 你在用 Meteor 吗?

标签: javascript json mongodb mongodb-query mongojs


【解决方案1】:

尝试交换$in和$oid的顺序

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

在你的情况下,你需要一个小的辅助函数,从 id 数组到带有 $oid 字段的对象数组

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我无法更改它以及我不想更改的点,因为它是默认的自动 ID“类型”。我也在更多关于 SO 的问题中看到了它。官方文档提到它:docs.mongodb.org/manual/reference/mongodb-extended-json{ "$oid": "&lt;id&gt;" } 部分,其中 id 代表 24 个字符的十六进制字符串)。我使用 JavaScript、JSON、mongodb。
    • 尝试以这样的方式创建对象ID:ObjectID = require('mongodb').ObjectID ....attackersIds[a] = new ObjectId(attackersIds[a]);
    • @PolGraphic 你用 mongojs 吗?
    【解决方案3】:

    您可以尝试将其转换为这样的 objectid:

    mongoose.Types.ObjectId(string)
    

    mongoose 是你的猫鼬句柄:

    var mongoose = require('mongoose')
    

    或者您可能不需要:

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

    【讨论】:

      猜你喜欢
      • 2019-07-10
      • 1970-01-01
      • 2013-04-11
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多