Javascript Firestore上的条件where查询

Javascript Firestore上的条件where查询,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,我尝试在这里实施解决方案: 但它们似乎不起作用(参见下面的代码示例)。Firestore有什么变化吗?我把下面的代码搞乱了吗 提前感谢 对于上下文,下面是react功能组件中的useEffect挂钩。但是,我不认为这是相关的,因为下面的工作示例(没有条件查询)可以很好地工作 基本示例-过滤器硬编码-工作正常。已应用过滤器 const query = db.collection('todos') .where('userId', '==', userId) .where('st

我尝试在这里实施解决方案:

但它们似乎不起作用(参见下面的代码示例)。Firestore有什么变化吗?我把下面的代码搞乱了吗

提前感谢

对于上下文,下面是react功能组件中的useEffect挂钩。但是,我不认为这是相关的,因为下面的工作示例(没有条件查询)可以很好地工作

基本示例-过滤器硬编码-工作正常。已应用过滤器

const query = db.collection('todos')
    .where('userId', '==', userId)
    .where('status', '==', 'pending');

query.onSnapshot((res) => {
  const todos = [];
  res.forEach((todo) => {
    todos.push(todo.data());
  });
});
const query = db.collection('todos').where('userId', '==', userId);

if (filter === 'complete') {
  query.where('status', '==', 'pending');
}
if (filter === 'complete') {
  query.where('status', '==', 'complete');
}
query.onSnapshot((res) => {
  const todos = [];
  res.forEach((todo) => {
    todos.push(todo.data());
  });
});
const query = db.collection('todos').where('userId', '==', userId);

query.where( 'status', '==', 'pending' ); // This 'where' clause is being ignored

query.onSnapshot((res) => {
  const todos = [];
  res.forEach((todo) => {
    todos.push(todo.data());
  });
});
不起作用-返回具有所有状态的结果。IF块中的where查询尚未应用

const query = db.collection('todos')
    .where('userId', '==', userId)
    .where('status', '==', 'pending');

query.onSnapshot((res) => {
  const todos = [];
  res.forEach((todo) => {
    todos.push(todo.data());
  });
});
const query = db.collection('todos').where('userId', '==', userId);

if (filter === 'complete') {
  query.where('status', '==', 'pending');
}
if (filter === 'complete') {
  query.where('status', '==', 'complete');
}
query.onSnapshot((res) => {
  const todos = [];
  res.forEach((todo) => {
    todos.push(todo.data());
  });
});
const query = db.collection('todos').where('userId', '==', userId);

query.where( 'status', '==', 'pending' ); // This 'where' clause is being ignored

query.onSnapshot((res) => {
  const todos = [];
  res.forEach((todo) => {
    todos.push(todo.data());
  });
});
另一个确保if块本身不是问题所在的示例。创建了一个初始查询,并在其后面添加了一个“where”条件(但在onSnapshot之前)。在本例中,将应用userId where子句,而忽略status where子句。所有待办事项状态都将返回

const query = db.collection('todos')
    .where('userId', '==', userId)
    .where('status', '==', 'pending');

query.onSnapshot((res) => {
  const todos = [];
  res.forEach((todo) => {
    todos.push(todo.data());
  });
});
const query = db.collection('todos').where('userId', '==', userId);

if (filter === 'complete') {
  query.where('status', '==', 'pending');
}
if (filter === 'complete') {
  query.where('status', '==', 'complete');
}
query.onSnapshot((res) => {
  const todos = [];
  res.forEach((todo) => {
    todos.push(todo.data());
  });
});
const query = db.collection('todos').where('userId', '==', userId);

query.where( 'status', '==', 'pending' ); // This 'where' clause is being ignored

query.onSnapshot((res) => {
  const todos = [];
  res.forEach((todo) => {
    todos.push(todo.data());
  });
});

您没有正确地遵循该模式

每次要添加新条件时,都必须重新分配查询对象。简单地反复调用
where
并不能满足您的需要<代码>其中每次调用时都返回一个全新的查询对象。您必须继续在该对象上构建,而不是原始对象

// use LET, not CONST, so you can ressign it
let query = db.collection('todos').where('userId', '==', userId);

// Reassign query, don't just call where and ignore the return value
if (filter === 'complete') {
  query = query.where('status', '==', 'pending');
}