Node.js 如何编写使用文档中两个字段的查询

Node.js 如何编写使用文档中两个字段的查询,node.js,mongodb,Node.js,Mongodb,标题可能还不够。让我解释一下 假设我的数据库结构为 { name: "alex", age: "21", location: "university-alex" } 我知道这个数据库结构不合理,但我只想用最短的方式来说明我的问题 我想获取位置包含名称字段值的文档。这里的university alex包括,alex,因此它应该作为查询结果返回 到目前为止我做了什么? 我编写了此查询,但无法得到结果 db.collection.find({location: {$regex

标题可能还不够。让我解释一下

假设我的数据库结构为

{
    name: "alex",
    age: "21",
    location: "university-alex"
}
我知道这个数据库结构不合理,但我只想用最短的方式来说明我的问题

我想获取
位置
包含
名称
字段值的文档。这里的
university alex
包括,
alex
,因此它应该作为查询结果返回

到目前为止我做了什么? 我编写了此查询,但无法得到结果

db.collection.find({location: {$regex: "$name"}})

如何编辑它?

我认为您试图实现的目标可以通过
$where
操作符完成。 据

或者,您可以将JS表达式传递给find方法:

db.collection.find(function() { 
  return (this.location.includes(this.name)); 
});
希望有帮助,

向@boehm_的答案致以最诚挚的问候。

这是@boehm_答案中可行且非常清晰的一部分,您还可以创建一个多字段索引,用于查找所需内容。如果要执行组合查询方法,例如,如果传递的参数与其内容匹配或包含在其中,则查找多个
字符串
字段,则此类索引非常有用。你可以看一下这个文档页面。我不知道你是否在使用猫鼬,但可能有用

请注意,我的这种方法将返回所有包含一个或两个字段的文档,即您要查找的“单词”

在字段上创建索引之后

db.collection.createIndex(
   {
     name: "text",
     location: "text"
   }
 )
假设您已将此索引命名为
txtIndex
,则可以执行以下操作

用于节点方式的Mongo驱动程序

. . .

let userProjection = {
    "name": 1,
    "age": 1,
    "location": 1
};

/**
 *  @param req Contains information to find a user
 *  @param req.findMe Contains name concatenated to location 
 */
let findUsers = (req) => {
    letUsers = db.collection('users');
    return new Promise((resolve, reject) => {
        User.findOne({'txtIndex': params.body.findMe}, {fields: userProjection},(err, user) => {
           if (err) {
               return reject({message: 'MongoDB Error', err: err});
           }
           if (!user) {
               return reject({message: 'User not found!'});
           }
               return resolve(user);
        });

    });
}
let Users = require('./users-model.js);

/**
  *  @param req Contains information to find a user
  *  @param req.findMe Contains name concatenated to location 
  */
let findUsers = (req) => {
   Users.findOne({txtIndex: req.body.FindMe}).then( function (err, user) {
         if (err) {
           return reject({message: 'MongoDB Error', err: err});
         }
         if (!user) {
           return reject({message: 'User not found!'});
         }
           return resolve(user);
    });    

}
猫鼬路

. . .

let userProjection = {
    "name": 1,
    "age": 1,
    "location": 1
};

/**
 *  @param req Contains information to find a user
 *  @param req.findMe Contains name concatenated to location 
 */
let findUsers = (req) => {
    letUsers = db.collection('users');
    return new Promise((resolve, reject) => {
        User.findOne({'txtIndex': params.body.findMe}, {fields: userProjection},(err, user) => {
           if (err) {
               return reject({message: 'MongoDB Error', err: err});
           }
           if (!user) {
               return reject({message: 'User not found!'});
           }
               return resolve(user);
        });

    });
}
let Users = require('./users-model.js);

/**
  *  @param req Contains information to find a user
  *  @param req.findMe Contains name concatenated to location 
  */
let findUsers = (req) => {
   Users.findOne({txtIndex: req.body.FindMe}).then( function (err, user) {
         if (err) {
           return reject({message: 'MongoDB Error', err: err});
         }
         if (!user) {
           return reject({message: 'User not found!'});
         }
           return resolve(user);
    });    

}
可能受骗