【问题标题】:Javascript - Model find method for Mongodb Collection not work with filter conditionsJavascript - Mongodb Collection 的模型查找方法不适用于过滤条件
【发布时间】:2018-12-12 02:44:42
【问题描述】:

我正在使用 Loopback 框架和 Mongodb 开发一个项目。而且我面临着从应用层在 Mongodb 集合中查找文档的问题。它不适用于过滤条件。我总是在 Collection 中获取所有文档。

这是我的模型架构

    {
  "name": "MyModel",
  "plural": "mymodel",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "title": {
      "type": "string",
      "required": true
    },
    "description": {
      "type": "string",
      "required": true
    },
    "guide_to_make": {
      "type": "string",
      "required": true
    },
    "media": {
      "type": "object",
      "required": true
    },
    "price": {
      "type": "number",
      "required": true,
      "default": 0
    },
    "discount": {
      "type": "number",
      "default": 0
    },
    "status": {
      "type": "number",
      "required": true,
      "default": 1
    },
    "user_provider": {
      "type": "string",
      "required": true
    },
    "create_at": {
      "type": "date",
      "required": true,
      "defaultFn": "now"
    },
    "last_update": {
      "type": "date",
      "required": true,
      "defaultFn": "now"
    }
  },
  "validations": [],
  "relations": {},
  "acls": [
    {
      "accessType": "WRITE",
      "principalType": "ROLE",
      "principalId": "$unauthenticated",
      "permission": "DENY"
    }
  ],
  "methods": {}
}

这是我过去使用过滤器查询以查找与过滤条件匹配的项目的某种方式:

MyModel.find({user_provide:'5ae9e8400e59ae0ecc5ed614'},(err,items)=>{console.log(JSON.stringify(items))});

MyModel.find({user_provide:{'like':'5ae9e8400e59ae0ecc5ed614'}},(err,items)=>{console.log(JSON.stringify(items))});

或者我尝试如下直接使用mongo连接:

var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";

    MongoClient.connect(url, function (err, db) {
        if (err) throw err;
        var dbo = db.db("asiodb");
        dbo.collection("Mymodel").find({}, { user_provider: '5ae9e8400e59ae0ecc5ed614' }).toArray(function (err, result) {
            if (err) throw err;
            console.log(result);
            db.close();
        });
    });

但是通过我使用的所有方法,我总是将所有文档都放在 Collection 中。我已经在 Robo3T 中使用 mongo 查询命令测试了过滤条件

db.getCollection('Mymodel').find({user_provider:'5ae9e8400e59ae0ecc5ed614'})

在 Robo3T 中也可以使用 mongo 命令。它可以找到符合条件的项目 我不知道为什么它在我的带有 JS 代码的服务器层上不起作用。

请有人告诉我 JS 代码有什么问题或使用 mongo find 方法的正确语法。

非常感谢!

【问题讨论】:

  • 你的键名不正确user_provide...应该是user_provider
  • 对不起,是我复制代码到stackoverflow的时候出错了。但在我的程序中,正是 user_provider

标签: javascript mongodb mongoose loopback


【解决方案1】:

更新:

使用节点 mongodb 驱动程序,您应该在 find 函数的第一个参数中使用您的过滤器,而不是在第二个参数中,就像您在代码中所做的那样。

应该是这样的:

var MongoClient = require('mongodb').MongoClient;
var ObjectID = require('mongodb').ObjectID;
var url = "mongodb://localhost:27017/asiodb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;

    db.collection('Mymodel').find({ user_provider : '5ae9e8400e59ae0ecc5ed614' }, {}).toArray(function(err, result) {
        if (err) throw err;
        console.log(result);
        db.close();
    });
});

【讨论】:

  • 谢谢回复,Tomas 先生 user_provider 是 id 字段,但是在另一个 Collection 中,在这个 Collection 中这个字段只是字符串。我已经用 ObjectID('5ae9e8400e59ae0ecc5ed614') 进行了测试。我得到了相同的结果,它获取了此集合中的所有文档,并且不适用于过滤条件
  • @AcidBurn ,我刚刚更新了我的答案。我相信这一次会奏效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 2023-03-29
  • 2020-11-27
  • 1970-01-01
相关资源
最近更新 更多