Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何基于对象查询mongodb以获取包含一个或多个相等属性的文档(搜索)_Node.js_Mongodb_Routes_Koa - Fatal编程技术网

Node.js 如何基于对象查询mongodb以获取包含一个或多个相等属性的文档(搜索)

Node.js 如何基于对象查询mongodb以获取包含一个或多个相等属性的文档(搜索),node.js,mongodb,routes,koa,Node.js,Mongodb,Routes,Koa,我正在尝试找出如何将搜索对象发布到mongo,并找到与搜索对象中声明的一个或多个属性匹配的所有文档 例如,如果我发布了一个json对象,如下所示: // searchObject { "kind": "employee" "name": "casper", "email": "daniel@mail.com" } 我想获取包含“名称”:“casper”或“电子邮件”的所有文档:daniel@mail.com“或从员工集合中选择两者 这就是我目前所拥有的。但是我不知道如何循环我的属性

我正在尝试找出如何将搜索对象发布到mongo,并找到与搜索对象中声明的一个或多个属性匹配的所有文档

例如,如果我发布了一个json对象,如下所示:

// searchObject
{
  "kind": "employee"
  "name": "casper",
  "email": "daniel@mail.com"
}
我想获取包含
“名称”:“casper”
“电子邮件”的所有文档:daniel@mail.com“
或从员工集合中选择两者

这就是我目前所拥有的。但是我不知道如何循环我的属性

router.post('/search', async (ctx) => {
  const searchObject = Object.assign(ctx.request.body);
  const collection = searchObject.kind

  const result = await store[collection].find({
    $and: [{ searchObject }]
  })
  console.log('result', result)
})
试试这个:

router.post('/search',异步ctx=>{
const{kind,…searchObject}=ctx.request.body;
const collection=searchObject.kind;
const conditions=Object.keys(searchObject).reduce((acc,key)=>{
acc.push({[key]:searchObject[key]});
返回acc;
}, []);
const result=等待存储[collection]。查找({
$or:条件,
});
console.log('result',result);
});
在reduce函数中添加
if(key!=“kind”)
条件

router.post('/search', async ctx => {
const searchObject = ctx.request.body;
const collection = searchObject.kind;
const conditions = Object.keys(searchObject).reduce((acc, key) => {
    if (key !== "kind") acc.push({ [key]: searchObject[key] });
    return acc;
}, []);

const result = await store[collection].find({
    $or: conditions,
});
console.log('result', result); 
});

嗯,据我所知,我们用{kind,…searchObject}(扩展运算符)删除了kind attr。然后创建一个数组,其中包含searchObject中的每个key:value对。我们在mongo中使用的$or操作符是什么?当我尝试:console.log('conditions',conditions')时,我确实得到了一个条件[{key:undefined}],我猜是acc.push({key:acc[k]});应该是:acc.push({key:acc[key]})?我仍然不明白为什么我在尝试console.log条件时没有定义。它是否应该为我返回一个对象数组?我修复了我答案中的错误输入。首先,确保
ctx.request.body
不是
undefined
ctx.request.body是正确的。但我仍然没有定义。我创建了一个沙盒(没有帖子,只是一个虚拟对象,看看object.keyd和.reduce是否有效。但我仍然得到了错误。现在唯一的错误是我们需要在key周围设置[],比如:cc.push({[key]:searchObject[key]});否则键是“key”,而不是“title”或“email”。谢谢,先生!my mongo的结果仍然显示所有文档。不仅仅是包含searchObject中定义的属性的文档